5737: Merge branch 'master' into 5737-ruby231
authorLucas Di Pentima <lucas@curoverse.com>
Tue, 22 Nov 2016 16:40:45 +0000 (13:40 -0300)
committerLucas Di Pentima <lucas@curoverse.com>
Tue, 22 Nov 2016 16:40:45 +0000 (13:40 -0300)
275 files changed:
.gitignore
COPYING
apps/workbench/app/assets/javascripts/work_unit_component.js [new file with mode: 0644]
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/controllers/collections_controller.rb
apps/workbench/app/controllers/projects_controller.rb
apps/workbench/app/controllers/work_unit_templates_controller.rb
apps/workbench/app/controllers/work_units_controller.rb
apps/workbench/app/helpers/application_helper.rb
apps/workbench/app/models/arvados_base.rb
apps/workbench/app/models/container.rb
apps/workbench/app/models/container_request.rb
apps/workbench/app/models/container_work_unit.rb
apps/workbench/app/models/job.rb
apps/workbench/app/models/job_task.rb
apps/workbench/app/models/pipeline_instance.rb
apps/workbench/app/models/pipeline_instance_work_unit.rb
apps/workbench/app/models/proxy_work_unit.rb
apps/workbench/app/models/work_unit.rb
apps/workbench/app/views/pipeline_instances/_show_components.html.erb
apps/workbench/app/views/projects/_show_workflows.html.erb [new file with mode: 0644]
apps/workbench/app/views/work_units/_component_detail.html.erb
apps/workbench/app/views/work_units/_show_child.html.erb
apps/workbench/app/views/work_units/_show_component.html.erb
apps/workbench/app/views/work_units/_show_log_link.html.erb [new file with mode: 0644]
apps/workbench/app/views/work_units/_show_status.html.erb
apps/workbench/config/routes.rb
apps/workbench/test/controllers/disabled_api_test.rb [new file with mode: 0644]
apps/workbench/test/diagnostics/pipeline_test.rb
apps/workbench/test/diagnostics_test_helper.rb
apps/workbench/test/integration/jobs_test.rb
apps/workbench/test/integration/pipeline_instances_test.rb
apps/workbench/test/integration/work_units_test.rb
apps/workbench/test/unit/disabled_api_test.rb [new file with mode: 0644]
apps/workbench/test/unit/work_unit_test.rb
build/go-python-package-scripts/postinst
build/go-python-package-scripts/prerm
build/package-testing/test-package-python-arvados-cwl-runner.sh [new symlink]
build/package-testing/test-package-python-arvados-fuse.sh [new symlink]
build/package-testing/test-package-python-arvados-python-client.sh [new symlink]
build/package-testing/test-package-python27-python-arvados-cwl-runner.sh [new file with mode: 0755]
build/package-testing/test-package-python27-python-arvados-python-client.sh
build/run-build-docker-images.sh
build/run-build-docker-jobs-image.sh
build/run-build-packages.sh
build/run-library.sh
build/run-tests.sh
crunch_scripts/cwl-runner
doc/_config.yml
doc/_includes/_container_runtime_constraints.liquid
doc/_includes/_crunch1only_begin.liquid [new file with mode: 0644]
doc/_includes/_crunch1only_end.liquid [new file with mode: 0644]
doc/_includes/_install_docker_cleaner.liquid
doc/_includes/_notebox_begin_warning.liquid [new file with mode: 0644]
doc/_includes/_pipeline_deprecation_notice.liquid
doc/_layouts/default.html.liquid
doc/api/authentication.html.textile.liquid [deleted file]
doc/api/crunch-scripts.html.textile.liquid
doc/api/execution.html.textile.liquid [new file with mode: 0644]
doc/api/index.html.textile.liquid
doc/api/methods.html.textile.liquid
doc/api/methods/api_client_authorizations.html.textile.liquid
doc/api/methods/api_clients.html.textile.liquid
doc/api/methods/authorized_keys.html.textile.liquid
doc/api/methods/collections.html.textile.liquid
doc/api/methods/container_requests.html.textile.liquid
doc/api/methods/containers.html.textile.liquid
doc/api/methods/groups.html.textile.liquid
doc/api/methods/humans.html.textile.liquid
doc/api/methods/job_tasks.html.textile.liquid
doc/api/methods/jobs.html.textile.liquid
doc/api/methods/keep_disks.html.textile.liquid
doc/api/methods/keep_services.html.textile.liquid
doc/api/methods/links.html.textile.liquid
doc/api/methods/logs.html.textile.liquid
doc/api/methods/nodes.html.textile.liquid
doc/api/methods/pipeline_instances.html.textile.liquid
doc/api/methods/pipeline_templates.html.textile.liquid
doc/api/methods/repositories.html.textile.liquid
doc/api/methods/specimens.html.textile.liquid
doc/api/methods/traits.html.textile.liquid
doc/api/methods/users.html.textile.liquid
doc/api/methods/virtual_machines.html.textile.liquid
doc/api/methods/workflows.html.textile.liquid
doc/api/permission-model.html.textile.liquid
doc/api/requests.html.textile.liquid [new file with mode: 0644]
doc/api/resources.html.textile.liquid
doc/api/schema/ApiClient.html.textile.liquid [deleted file]
doc/api/schema/ApiClientAuthorization.html.textile.liquid [deleted file]
doc/api/schema/AuthorizedKey.html.textile.liquid [deleted file]
doc/api/schema/Collection.html.textile.liquid [deleted file]
doc/api/schema/Container.html.textile.liquid [deleted file]
doc/api/schema/ContainerRequest.html.textile.liquid [deleted file]
doc/api/schema/Group.html.textile.liquid [deleted file]
doc/api/schema/Human.html.textile.liquid [deleted file]
doc/api/schema/Job.html.textile.liquid [deleted file]
doc/api/schema/JobTask.html.textile.liquid [deleted file]
doc/api/schema/KeepDisk.html.textile.liquid [deleted file]
doc/api/schema/KeepService.html.textile.liquid [deleted file]
doc/api/schema/Link.html.textile.liquid [deleted file]
doc/api/schema/Log.html.textile.liquid [deleted file]
doc/api/schema/Node.html.textile.liquid [deleted file]
doc/api/schema/PipelineInstance.html.textile.liquid [deleted file]
doc/api/schema/PipelineTemplate.html.textile.liquid [deleted file]
doc/api/schema/Repository.html.textile.liquid [deleted file]
doc/api/schema/Specimen.html.textile.liquid [deleted file]
doc/api/schema/Trait.html.textile.liquid [deleted file]
doc/api/schema/User.html.textile.liquid [deleted file]
doc/api/schema/VirtualMachine.html.textile.liquid [deleted file]
doc/api/schema/Workflow.html.textile.liquid [deleted file]
doc/api/storage.html.textile.liquid [new file with mode: 0644]
doc/api/tokens.html.textile.liquid [new file with mode: 0644]
doc/images/Arvados_Permissions.svg [new file with mode: 0644]
doc/images/Crunch_dispatch.svg [new file with mode: 0644]
doc/images/Keep_manifests.svg [new file with mode: 0644]
doc/images/Keep_reading_writing_block.svg [new file with mode: 0644]
doc/images/Keep_rendezvous_hashing.svg [new file with mode: 0644]
doc/images/Session_Establishment.svg [new file with mode: 0644]
doc/install/crunch2-slurm/install-prerequisites.html.textile.liquid
doc/install/install-arv-git-httpd.html.textile.liquid
doc/install/install-keep-web.html.textile.liquid
doc/install/install-keepproxy.html.textile.liquid
doc/sdk/cli/install.html.textile.liquid
doc/sdk/go/example.html.textile.liquid [new file with mode: 0644]
doc/sdk/go/index.html.textile.liquid
doc/sdk/index.html.textile.liquid
doc/sdk/java/example.html.textile.liquid [new file with mode: 0644]
doc/sdk/java/index.html.textile.liquid
doc/sdk/perl/example.html.textile.liquid [new file with mode: 0644]
doc/sdk/perl/index.html.textile.liquid
doc/sdk/python/events.html.textile.liquid
doc/sdk/python/example.html.textile.liquid [new file with mode: 0644]
doc/sdk/python/sdk-python.html.textile.liquid
doc/sdk/ruby/example.html.textile.liquid [new file with mode: 0644]
doc/sdk/ruby/index.html.textile.liquid
doc/user/cwl/cwl-runner.html.textile.liquid
doc/user/reference/job-pipeline-ref.html.textile.liquid
doc/user/topics/arv-run.html.textile.liquid
doc/user/topics/running-pipeline-command-line.html.textile.liquid
doc/user/tutorials/running-external-program.html.textile.liquid
doc/user/tutorials/tutorial-pipeline-workbench.html.textile.liquid
doc/user/tutorials/tutorial-submit-job.html.textile.liquid
docker/jobs/Dockerfile
sdk/cli/bin/arv-run-pipeline-instance
sdk/cli/bin/crunch-job
sdk/cwl/arvados_cwl/__init__.py
sdk/cwl/arvados_cwl/arvcontainer.py
sdk/cwl/arvados_cwl/arvdocker.py
sdk/cwl/arvados_cwl/arvjob.py
sdk/cwl/arvados_cwl/arvworkflow.py
sdk/cwl/arvados_cwl/crunch_script.py [new file with mode: 0644]
sdk/cwl/arvados_cwl/pathmapper.py
sdk/cwl/arvados_cwl/runner.py
sdk/cwl/gittaggers.py [changed from symlink to file mode: 0644]
sdk/cwl/setup.py
sdk/cwl/test_with_arvbox.sh
sdk/cwl/tests/hw.py [new file with mode: 0644]
sdk/cwl/tests/mock_discovery.py [new file with mode: 0644]
sdk/cwl/tests/test_container.py
sdk/cwl/tests/test_job.py
sdk/cwl/tests/test_make_output.py
sdk/cwl/tests/test_pathmapper.py [new file with mode: 0644]
sdk/cwl/tests/test_submit.py
sdk/go/arvados/container.go
sdk/go/arvados/duration.go
sdk/go/streamer/streamer.go
sdk/go/streamer/streamer_test.go
sdk/python/arvados/arvfile.py
sdk/python/arvados/commands/put.py
sdk/python/arvados/events.py
sdk/python/tests/run_test_server.py
sdk/python/tests/test_collections.py
services/api/Gemfile
services/api/Gemfile.lock
services/api/app/controllers/application_controller.rb
services/api/app/controllers/arvados/v1/collections_controller.rb
services/api/app/controllers/arvados/v1/container_requests_controller.rb
services/api/app/controllers/arvados/v1/containers_controller.rb
services/api/app/controllers/arvados/v1/groups_controller.rb
services/api/app/controllers/arvados/v1/schema_controller.rb
services/api/app/controllers/user_sessions_controller.rb
services/api/app/models/arvados_model.rb
services/api/app/models/collection.rb
services/api/app/models/container.rb
services/api/app/models/container_request.rb
services/api/app/models/log.rb
services/api/app/models/node.rb
services/api/app/models/user.rb
services/api/config/application.default.yml
services/api/config/routes.rb
services/api/db/migrate/20161019171346_add_use_existing_to_container_requests.rb [new file with mode: 0644]
services/api/db/migrate/20161111143147_add_scheduling_parameters_to_container.rb [new file with mode: 0644]
services/api/db/migrate/20161115171221_add_output_and_log_uuid_to_container_request.rb [new file with mode: 0644]
services/api/db/migrate/20161115174218_add_output_and_log_uuids_to_container_request_search_index.rb [new file with mode: 0644]
services/api/db/structure.sql
services/api/lib/josh_id.rb
services/api/test/fixtures/api_client_authorizations.yml
services/api/test/fixtures/collections.yml
services/api/test/fixtures/containers.yml
services/api/test/fixtures/nodes.yml
services/api/test/functional/arvados/v1/collections_controller_test.rb
services/api/test/functional/arvados/v1/container_requests_controller_test.rb [new file with mode: 0644]
services/api/test/functional/arvados/v1/containers_controller_test.rb
services/api/test/functional/arvados/v1/jobs_controller_test.rb
services/api/test/functional/arvados/v1/schema_controller_test.rb
services/api/test/integration/user_sessions_test.rb
services/api/test/unit/container_request_test.rb
services/api/test/unit/container_test.rb
services/api/test/unit/log_test.rb
services/api/test/unit/node_test.rb
services/arv-git-httpd/arvados-git-httpd.service
services/arv-git-httpd/doc.go [deleted file]
services/arv-git-httpd/git_handler.go
services/arv-git-httpd/git_handler_test.go
services/arv-git-httpd/gitolite_test.go
services/arv-git-httpd/integration_test.go
services/arv-git-httpd/main.go
services/arv-git-httpd/usage.go
services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
services/crunch-dispatch-slurm/squeue.go
services/crunch-run/crunchrun.go
services/crunch-run/crunchrun_test.go
services/dockercleaner/arvados-docker-cleaner.service
services/dockercleaner/arvados_docker/cleaner.py
services/dockercleaner/setup.py
services/dockercleaner/tests/test_cleaner.py
services/fuse/arvados_fuse/__init__.py
services/fuse/arvados_fuse/command.py
services/fuse/tests/integration_test.py
services/fuse/tests/test_command_args.py
services/fuse/tests/test_mount.py
services/fuse/tests/test_token_expiry.py [new file with mode: 0644]
services/keep-web/main.go
services/keepproxy/keepproxy.go
services/keepstore/azure_blob_volume.go
services/keepstore/azure_blob_volume_test.go
services/keepstore/bufferpool_test.go
services/keepstore/collision.go
services/keepstore/config.go [new file with mode: 0644]
services/keepstore/config_test.go [new file with mode: 0644]
services/keepstore/count.go [new file with mode: 0644]
services/keepstore/deprecated.go [new file with mode: 0644]
services/keepstore/handler_test.go
services/keepstore/handlers.go
services/keepstore/handlers_with_generic_volume_test.go
services/keepstore/keepstore.go
services/keepstore/keepstore.service [new file with mode: 0644]
services/keepstore/keepstore_test.go
services/keepstore/perms.go
services/keepstore/perms_test.go
services/keepstore/pull_worker.go
services/keepstore/pull_worker_test.go
services/keepstore/s3_volume.go
services/keepstore/s3_volume_test.go
services/keepstore/trash_worker.go
services/keepstore/trash_worker_test.go
services/keepstore/usage.go [new file with mode: 0644]
services/keepstore/volume.go
services/keepstore/volume_generic_test.go
services/keepstore/volume_test.go
services/keepstore/volume_unix.go
services/keepstore/volume_unix_test.go
services/login-sync/bin/arvados-login-sync
services/login-sync/test/test_add_user.rb
tools/arvbox/bin/arvbox
tools/arvbox/lib/arvbox/docker/Dockerfile.base
tools/arvbox/lib/arvbox/docker/Dockerfile.demo
tools/arvbox/lib/arvbox/docker/Dockerfile.dev
tools/arvbox/lib/arvbox/docker/common.sh
tools/arvbox/lib/arvbox/docker/crunch-setup.sh
tools/arvbox/lib/arvbox/docker/service/arv-git-httpd/run-service
tools/arvbox/lib/arvbox/docker/service/ready/run-service
tools/arvbox/lib/arvbox/docker/service/sdk/run-service
tools/keep-exercise/keep-exercise.go

index d5c4b3715e800c300a8b29f7c9742fb5a7b2d62d..8f2b33ad2f8484c274838299cca722256bbcafa0 100644 (file)
@@ -22,3 +22,6 @@ sdk/java/target
 *.class
 sdk/java/log
 tmp
+sdk/cli/binstubs/
+sdk/cwl/arvados_cwl/_version.py
+services/api/config/arvados-clients.yml
diff --git a/COPYING b/COPYING
index acbd7523ed49f01217874965aa3180cccec89d61..2cba2ad20a1fbf4aeae5e00ad55f64ed0eeb5b47 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -1,11 +1,15 @@
 Server-side components of Arvados contained in the apps/ and services/
 directories, including the API Server, Workbench, and Crunch, are licensed
-under the GNU Affero General Public License version 3 (see agpl-3.0.txt)
+under the GNU Affero General Public License version 3 (see agpl-3.0.txt).
+
+The files and directories under the build/, lib/ and tools/ directories are
+licensed under the GNU Affero General Public License version 3 (see
+agpl-3.0.txt).
 
 The Arvados client Software Development Kits contained in the sdk/ directory,
-example scripts in the crunch_scripts/ directory, and code samples in the
-Aravados documentation are licensed under the Apache License, Version 2.0 (see
-LICENSE-2.0.txt)
+example scripts in the crunch_scripts/ directory, the files and directories
+under backports/ and docker/, and code samples in the Aravados documentation
+are licensed under the Apache License, Version 2.0 (see LICENSE-2.0.txt).
 
 The Arvados Documentation located in the doc/ directory is licensed under the
-Creative Commons Attribution-Share Alike 3.0 United States (see by-sa-3.0.txt)
\ No newline at end of file
+Creative Commons Attribution-Share Alike 3.0 United States (see by-sa-3.0.txt).
diff --git a/apps/workbench/app/assets/javascripts/work_unit_component.js b/apps/workbench/app/assets/javascripts/work_unit_component.js
new file mode 100644 (file)
index 0000000..baff0e8
--- /dev/null
@@ -0,0 +1,18 @@
+$(document).
+    on('click', '.component-detail-panel', function(event) {
+      var href = $($(event.target).attr('href'));
+      if ($(href).attr("class").split(' ').indexOf("in") == -1) {
+        return;   // collapsed; nothing more to do
+      }
+
+      var content_div = href.find('.work-unit-component-detail-body');
+      content_div.html('<div class="spinner spinner-32px col-sm-1"></div>');
+      var content_url = href.attr('content-url');
+      var action_data = href.attr('action-data');
+      $.ajax(content_url, {dataType: 'html', type: 'POST', data: {action_data: action_data}}).
+          done(function(data, status, jqxhr) {
+              content_div.html(data);
+          }).fail(function(jqxhr, status, error) {
+              content_div.html(error);
+          });
+      });
index b2f5c70cbb69a2a2f0861f127aa88ef5d3a59d99..ee3ac4d6810588b7d630705a5efe4cd6e08bd6ae 100644 (file)
@@ -13,6 +13,7 @@ class ApplicationController < ActionController::Base
   # Methods that don't require login should
   #   skip_around_filter :require_thread_api_token
   around_filter :require_thread_api_token, except: ERROR_ACTIONS
+  before_filter :ensure_arvados_api_exists, only: [:index, :show]
   before_filter :set_cache_buster
   before_filter :accept_uuid_as_id_param, except: ERROR_ACTIONS
   before_filter :check_user_agreements, except: ERROR_ACTIONS
@@ -213,6 +214,13 @@ class ApplicationController < ActionController::Base
     end
   end
 
+  def ensure_arvados_api_exists
+    if model_class.is_a?(Class) && model_class < ArvadosBase && !model_class.api_exists?(params['action'].to_sym)
+      @errors = ["#{params['action']} method is not supported for #{params['controller']}"]
+      return render_error(status: 404)
+    end
+  end
+
   def index
     find_objects_for_index if !@objects
     render_index
@@ -526,16 +534,17 @@ class ApplicationController < ActionController::Base
     begin
       if not model_class
         @object = nil
+      elsif params[:uuid].nil? or params[:uuid].empty?
+        @object = nil
       elsif not params[:uuid].is_a?(String)
         @object = model_class.where(uuid: params[:uuid]).first
-      elsif params[:uuid].empty?
-        @object = nil
       elsif (model_class != Link and
              resource_class_for_uuid(params[:uuid]) == Link)
         @name_link = Link.find(params[:uuid])
         @object = model_class.find(@name_link.head_uuid)
       else
         @object = model_class.find(params[:uuid])
+        load_preloaded_objects [@object]
       end
     rescue ArvadosApiClient::NotFoundException, ArvadosApiClient::NotLoggedInException, RuntimeError => error
       if error.is_a?(RuntimeError) and (error.message !~ /^argument to find\(/)
@@ -759,7 +768,11 @@ class ApplicationController < ActionController::Base
   }
 
   @@notification_tests.push lambda { |controller, current_user|
-    PipelineInstance.limit(1).where(created_by: current_user.uuid).each do
+    if PipelineInstance.api_exists?(:index)
+      PipelineInstance.limit(1).where(created_by: current_user.uuid).each do
+        return nil
+      end
+    else
       return nil
     end
     return lambda { |view|
@@ -855,12 +868,14 @@ class ApplicationController < ActionController::Base
   def recent_processes lim
     lim = 12 if lim.nil?
 
-    cols = %w(uuid owner_uuid created_at modified_at pipeline_template_uuid name state started_at finished_at)
-    pipelines = PipelineInstance.select(cols).limit(lim).order(["created_at desc"])
+    procs = {}
+    if PipelineInstance.api_exists?(:index)
+      cols = %w(uuid owner_uuid created_at modified_at pipeline_template_uuid name state started_at finished_at)
+      pipelines = PipelineInstance.select(cols).limit(lim).order(["created_at desc"])
+      pipelines.results.each { |pi| procs[pi] = pi.created_at }
+    end
 
     crs = ContainerRequest.limit(lim).order(["created_at desc"]).filter([["requesting_container_uuid", "=", nil]])
-    procs = {}
-    pipelines.results.each { |pi| procs[pi] = pi.created_at }
     crs.results.each { |c| procs[c] = c.created_at }
 
     Hash[procs.sort_by {|key, value| value}].keys.reverse.first(lim)
@@ -1180,15 +1195,15 @@ class ApplicationController < ActionController::Base
 
   # helper method to get object of a given dataclass and uuid
   helper_method :object_for_dataclass
-  def object_for_dataclass dataclass, uuid
+  def object_for_dataclass dataclass, uuid, by_attr=nil
     raise ArgumentError, 'No input argument dataclass' unless (dataclass && uuid)
-    preload_objects_for_dataclass(dataclass, [uuid])
+    preload_objects_for_dataclass(dataclass, [uuid], by_attr)
     @objects_for[uuid]
   end
 
   # helper method to preload objects for given dataclass and uuids
   helper_method :preload_objects_for_dataclass
-  def preload_objects_for_dataclass dataclass, uuids
+  def preload_objects_for_dataclass dataclass, uuids, by_attr=nil
     @objects_for ||= {}
 
     raise ArgumentError, 'Argument is not a data class' unless dataclass.is_a? Class
@@ -1205,12 +1220,29 @@ class ApplicationController < ActionController::Base
     uuids.each do |x|
       @objects_for[x] = nil
     end
-    dataclass.where(uuid: uuids).each do |obj|
-      @objects_for[obj.uuid] = obj
+    if by_attr and ![:uuid, :name].include?(by_attr)
+      raise ArgumentError, "Preloading only using lookups by uuid or name are supported: #{by_attr}"
+    elsif by_attr and by_attr == :name
+      dataclass.where(name: uuids).each do |obj|
+        @objects_for[obj.name] = obj
+      end
+    else
+      dataclass.where(uuid: uuids).each do |obj|
+        @objects_for[obj.uuid] = obj
+      end
     end
     @objects_for
   end
 
+  # helper method to load objects that are already preloaded
+  helper_method :load_preloaded_objects
+  def load_preloaded_objects objs
+    @objects_for ||= {}
+    objs.each do |obj|
+      @objects_for[obj.uuid] = obj
+    end
+  end
+
   def wiselinks_layout
     'body'
   end
index 20b227c3c7277d491c74b96c0f5de7bc415c0f4c..46dcab6dce38487a7bb938472e91f209f4e926e2 100644 (file)
@@ -239,12 +239,15 @@ class CollectionsController < ApplicationController
         render 'hash_matches'
         return
       else
-        jobs_with = lambda do |conds|
-          Job.limit(RELATION_LIMIT).where(conds)
-            .results.sort_by { |j| j.finished_at || j.created_at }
+        if Job.api_exists?(:index)
+          jobs_with = lambda do |conds|
+            Job.limit(RELATION_LIMIT).where(conds)
+              .results.sort_by { |j| j.finished_at || j.created_at }
+          end
+          @output_of = jobs_with.call(output: @object.portable_data_hash)
+          @log_of = jobs_with.call(log: @object.portable_data_hash)
         end
-        @output_of = jobs_with.call(output: @object.portable_data_hash)
-        @log_of = jobs_with.call(log: @object.portable_data_hash)
+
         @project_links = Link.limit(RELATION_LIMIT).order("modified_at DESC")
           .where(head_uuid: @object.uuid, link_class: 'name').results
         project_hash = Group.where(uuid: @project_links.map(&:tail_uuid)).to_hash
index 16212a8d0ad489b381aa3619d69d72443905cfcb..0a2044a0e23e96b741d77658dfa91057fe57bdfa 100644 (file)
@@ -53,6 +53,19 @@ class ProjectsController < ApplicationController
   # It also seems to me that something like these could be used to configure the contents of the panes.
   def show_pane_list
     pane_list = []
+
+    procs = ["arvados#containerRequest"]
+    if PipelineInstance.api_exists?(:index)
+      procs << "arvados#pipelineInstance"
+    end
+
+    workflows = ["arvados#workflow"]
+    workflows_pane_name = 'Workflows'
+    if PipelineTemplate.api_exists?(:index)
+      workflows << "arvados#pipelineTemplate"
+      workflows_pane_name = 'Pipeline_templates'
+    end
+
     if @object.uuid != current_user.andand.uuid
       pane_list << 'Description'
     end
@@ -64,12 +77,12 @@ class ProjectsController < ApplicationController
     pane_list <<
       {
         :name => 'Pipelines_and_processes',
-        :filters => [%w(uuid is_a) + [%w(arvados#containerRequest arvados#pipelineInstance)]]
+        :filters => [%w(uuid is_a) + [procs]]
       }
     pane_list <<
       {
-        :name => 'Pipeline_templates',
-        :filters => [%w(uuid is_a) + [%w(arvados#pipelineTemplate arvados#workflow)]]
+        :name => workflows_pane_name,
+        :filters => [%w(uuid is_a) + [workflows]]
       }
     pane_list <<
       {
@@ -213,6 +226,10 @@ class ProjectsController < ApplicationController
       @name_link_for = {}
       kind_filters.each do |attr,op,val|
         (val.is_a?(Array) ? val : [val]).each do |type|
+          klass = type.split('#')[-1]
+          klass[0] = klass[0].capitalize
+          next if(!Object.const_get(klass).api_exists?(:index))
+
           filters = @filters - kind_filters + [['uuid', 'is_a', type]]
           if type == 'arvados#containerRequest'
             filters = filters + [['container_requests.requesting_container_uuid', '=', nil]]
index 6b5f114a66fda426aa2353fda68c48daf87c7b3e..fe53ac403c3faccf50cc17e2159be32a120e585e 100644 (file)
@@ -6,8 +6,10 @@ class WorkUnitTemplatesController < ApplicationController
     @filters = @filters || []
 
     # get next page of pipeline_templates
-    filters = @filters + [["uuid", "is_a", ["arvados#pipelineTemplate"]]]
-    pipelines = PipelineTemplate.limit(@limit).order(["created_at desc"]).filter(filters)
+    if PipelineTemplate.api_exists?(:index)
+      filters = @filters + [["uuid", "is_a", ["arvados#pipelineTemplate"]]]
+      pipelines = PipelineTemplate.limit(@limit).order(["created_at desc"]).filter(filters)
+    end
 
     # get next page of workflows
     filters = @filters + [["uuid", "is_a", ["arvados#workflow"]]]
index 6ed25dd334a77b083197c6ad8e39815aa8ea3eba..3b611aa25b74e28663d9b7ecc2b0647670f066c8 100644 (file)
@@ -1,4 +1,9 @@
 class WorkUnitsController < ApplicationController
+  skip_around_filter :require_thread_api_token, if: proc { |ctrl|
+    Rails.configuration.anonymous_user_token and
+    'show_child_component' == ctrl.action_name
+  }
+
   def find_objects_for_index
     # If it's not the index rows partial display, just return
     # The /index request will again be invoked to display the
@@ -9,12 +14,16 @@ class WorkUnitsController < ApplicationController
     @filters = @filters || []
 
     # get next page of pipeline_instances
-    filters = @filters + [["uuid", "is_a", ["arvados#pipelineInstance"]]]
-    pipelines = PipelineInstance.limit(@limit).order(["created_at desc"]).filter(filters)
+    if PipelineInstance.api_exists?(:index)
+      filters = @filters + [["uuid", "is_a", ["arvados#pipelineInstance"]]]
+      pipelines = PipelineInstance.limit(@limit).order(["created_at desc"]).filter(filters)
+    end
 
     # get next page of jobs
-    filters = @filters + [["uuid", "is_a", ["arvados#job"]]]
-    jobs = Job.limit(@limit).order(["created_at desc"]).filter(filters)
+    if Job.api_exists?(:index)
+      filters = @filters + [["uuid", "is_a", ["arvados#job"]]]
+      jobs = Job.limit(@limit).order(["created_at desc"]).filter(filters)
+    end
 
     # get next page of container_requests
     filters = @filters + [["uuid", "is_a", ["arvados#containerRequest"]]]
@@ -111,4 +120,53 @@ class WorkUnitsController < ApplicationController
       render_error status: 422
     end
   end
+
+  def find_object_by_uuid
+    if params['object_type']
+      @object = params['object_type'].constantize.find(params['uuid'])
+    else
+      super
+    end
+  end
+
+  def show_child_component
+    data = JSON.load(params[:action_data])
+
+    current_obj = {}
+    current_obj_uuid = data['current_obj_uuid']
+    current_obj_name = data['current_obj_name']
+    current_obj_type = data['current_obj_type']
+    current_obj_parent = data['current_obj_parent']
+    if current_obj_uuid
+      resource_class = resource_class_for_uuid current_obj_uuid
+      obj = object_for_dataclass(resource_class, current_obj_uuid)
+      current_obj = obj if obj
+    end
+
+    if current_obj.is_a?(Hash) and !current_obj.any?
+      if current_obj_parent
+        resource_class = resource_class_for_uuid current_obj_parent
+        parent = object_for_dataclass(resource_class, current_obj_parent)
+        parent_wu = parent.work_unit
+        children = parent_wu.children
+        if current_obj_uuid
+          wu = children.select {|c| c.uuid == current_obj_uuid}.first
+        else current_obj_name
+          wu = children.select {|c| c.label.to_s == current_obj_name}.first
+        end
+      end
+    else
+      if current_obj_type == JobWorkUnit.to_s
+        wu = JobWorkUnit.new(current_obj, current_obj_name, current_obj_parent)
+      elsif current_obj_type == PipelineInstanceWorkUnit.to_s
+        wu = PipelineInstanceWorkUnit.new(current_obj, current_obj_name, current_obj_parent)
+      elsif current_obj_type == ContainerWorkUnit.to_s
+        wu = ContainerWorkUnit.new(current_obj, current_obj_name, current_obj_parent)
+      end
+    end
+
+    respond_to do |f|
+      f.html { render(partial: "show_component", locals: {wu: wu}) }
+    end
+  end
 end
index b5df9f38a8c3c5da421476d47621ee96f3ca612e..21879a57a7d90aa77ba0f90e6a325f9ae9d5f00c 100644 (file)
@@ -126,7 +126,11 @@ module ApplicationHelper
           else
             begin
               if resource_class.name == 'Collection'
-                link_name = collections_for_object(link_uuid).andand.first.andand.friendly_link_name
+                if CollectionsHelper.match(link_uuid)
+                  link_name = collection_for_pdh(link_uuid).andand.first.andand.portable_data_hash
+                else
+                  link_name = collections_for_object(link_uuid).andand.first.andand.friendly_link_name
+                end
               else
                 link_name = object_for_dataclass(resource_class, link_uuid).andand.friendly_link_name
               end
index b02db7a6b63b5fad8c75ea5f107baa74a58d7151..6250daa06a3d0c65d2233f51c33588a9de3855a5 100644 (file)
@@ -334,7 +334,7 @@ class ArvadosBase < ActiveRecord::Base
   end
 
   def self.creatable?
-    current_user.andand.is_active
+    current_user.andand.is_active && api_exists?(:create)
   end
 
   def self.goes_in_projects?
@@ -361,6 +361,10 @@ class ArvadosBase < ActiveRecord::Base
     editable?
   end
 
+  def self.api_exists?(method)
+    arvados_api_client.discovery[:resources][self.to_s.underscore.pluralize.to_sym].andand[:methods].andand[method]
+  end
+
   # Array of strings that are the names of attributes that can be edited
   # with X-Editable.
   def editable_attributes
index 0a7c288718f581f89235cb9a9fed9fdcd76d1d8e..e683a6e4f2b28e501ce7adb3574c12db796b73b4 100644 (file)
@@ -4,6 +4,6 @@ class Container < ArvadosBase
   end
 
   def work_unit(label=nil)
-    ContainerWorkUnit.new(self, label)
+    ContainerWorkUnit.new(self, label, self.uuid)
   end
 end
index 0148de51f7459a678d49547fe4f24a10e6bc27e9..aae712b343e1468386ee77ba257d6eee04848063 100644 (file)
@@ -12,6 +12,6 @@ class ContainerRequest < ArvadosBase
   end
 
   def work_unit(label=nil)
-    ContainerWorkUnit.new(self, label)
+    ContainerWorkUnit.new(self, label, self.uuid)
   end
 end
index b6e72dc526538d022166d52ff0a342373bb585cc..88aab306cedc8b9ea5a8a94a27cc394f2022780b 100644 (file)
@@ -1,7 +1,7 @@
 class ContainerWorkUnit < ProxyWorkUnit
   attr_accessor :container
 
-  def initialize proxied, label
+  def initialize proxied, label, parent
     super
     if @proxied.is_a?(ContainerRequest)
       container_uuid = get(:container_uuid)
@@ -12,7 +12,7 @@ class ContainerWorkUnit < ProxyWorkUnit
   end
 
   def children
-    return self.my_children if self.my_children
+    return @my_children if @my_children
 
     container_uuid = nil
     container_uuid = if @proxied.is_a?(Container) then uuid else get(:container_uuid) end
@@ -25,7 +25,7 @@ class ContainerWorkUnit < ProxyWorkUnit
       end
     end
 
-    self.my_children = items
+    @my_children = items
   end
 
   def title
index bf202c4eaaadffbd92f1a44d1160c3bd8c51572e..7bfed6d44b5c089fb9ecc518362e026e787762f4 100644 (file)
@@ -54,6 +54,6 @@ class Job < ArvadosBase
   end
 
   def work_unit(label=nil)
-    JobWorkUnit.new(self, label)
+    JobWorkUnit.new(self, label, self.uuid)
   end
 end
index 9fb04737badb1114547c0a6a581f71e9b2bbd459..654e0a37e0897c6b85d4bd60a46ad0f76c521e0d 100644 (file)
@@ -1,5 +1,5 @@
 class JobTask < ArvadosBase
   def work_unit(label=nil)
-    JobTaskWorkUnit.new(self, label)
+    JobTaskWorkUnit.new(self, label, self.uuid)
   end
 end
index 62bbc5431937e6a4b89826a3f03e2cda5c37ff27..e9fa04ab6d09419f7875354a01c26b33c8c0b679 100644 (file)
@@ -133,7 +133,7 @@ class PipelineInstance < ArvadosBase
   end
 
   def work_unit(label=nil)
-    PipelineInstanceWorkUnit.new(self, label || self.name)
+    PipelineInstanceWorkUnit.new(self, label || self.name, self.uuid)
   end
 
   private
index dd5685ac3d8082d5a5836896afa310b416e728f2..293a77c099d829ae58e58d07784932ba1e9c5fdf 100644 (file)
@@ -18,10 +18,10 @@ class PipelineInstanceWorkUnit < ProxyWorkUnit
           if job[:uuid] and jobs[job[:uuid]]
             items << jobs[job[:uuid]].work_unit(name)
           else
-            items << JobWorkUnit.new(job, name)
+            items << JobWorkUnit.new(job, name, uuid)
           end
         else
-          items << JobWorkUnit.new(c, name)
+          items << JobWorkUnit.new(c, name, uuid)
         end
       else
         @unreadable_children = true
index 11ec0ee196326d6a5c7d06cf0f0455a11fc9b167..48bc3a04bc95dd41915e317449e7287ed4e42bce 100644 (file)
@@ -6,9 +6,10 @@ class ProxyWorkUnit < WorkUnit
   attr_accessor :my_children
   attr_accessor :unreadable_children
 
-  def initialize proxied, label
+  def initialize proxied, label, parent
     @lbl = label
     @proxied = proxied
+    @parent = parent
   end
 
   def label
@@ -19,6 +20,10 @@ class ProxyWorkUnit < WorkUnit
     get(:uuid)
   end
 
+  def parent
+    @parent
+  end
+
   def modified_by_user_uuid
     get(:modified_by_user_uuid)
   end
@@ -173,31 +178,6 @@ class ProxyWorkUnit < WorkUnit
     @unreadable_children
   end
 
-  def readable?
-    resource_class = ArvadosBase::resource_class_for_uuid(uuid)
-    resource_class.where(uuid: [uuid]).first rescue nil
-  end
-
-  def link_to_log
-    if state_label.in? ["Complete", "Failed", "Cancelled"]
-      lc = log_collection
-      if lc
-        logCollection = Collection.find? lc
-        if logCollection
-          ApplicationController.helpers.link_to("Log", "#{uri}#Log")
-        else
-          "Log unavailable"
-        end
-      end
-    elsif state_label == "Running"
-      if readable?
-        ApplicationController.helpers.link_to("Log", "#{uri}#Log")
-      else
-        "Log unavailable"
-      end
-    end
-  end
-
   def walltime
     if state_label != "Queued"
       if started_at
@@ -347,7 +327,7 @@ class ProxyWorkUnit < WorkUnit
     if obj.respond_to? key
       obj.send(key)
     elsif obj.is_a?(Hash)
-      obj[key]
+      obj[key] || obj[key.to_s]
     end
   end
 end
index 924e067815718fc0fddf52a836c99cd2d6ffd94b..dd4a706f9d6edfdbaf60b7607e62d3f40a672fe2 100644 (file)
@@ -9,6 +9,10 @@ class WorkUnit
     # returns the arvados UUID of the underlying object
   end
 
+  def parent
+    # returns the parent uuid of this work unit
+  end
+
   def children
     # returns an array of child work units
   end
@@ -115,10 +119,6 @@ class WorkUnit
     # returns true if this work unit can be canceled
   end
 
-  def readable?
-    # is the proxied object readable by current user?
-  end
-
   def uri
     # returns the uri for this work unit
   end
@@ -132,10 +132,6 @@ class WorkUnit
   end
 
   # view helper methods
-  def link_to_log
-    # display a link to log if present
-  end
-
   def walltime
     # return walltime for a running or completed work unit
   end
index b79759f989181564dc380e4dce55bdd5c27f292d..560b3a512b3d327b50c564ff55b947fcae854c75 100644 (file)
@@ -2,7 +2,7 @@
 
   <%
      job_uuids = @object.components.map { |k,j| j.is_a? Hash and j[:job].andand[:uuid] }.compact
-     throttle = @object.state.start_with?('Running') ? 5000 : 15000
+     throttle = 86486400000 # 1001 nights
      %>
   <div class="arv-log-refresh-control"
        data-load-throttle="<%= throttle %>"
diff --git a/apps/workbench/app/views/projects/_show_workflows.html.erb b/apps/workbench/app/views/projects/_show_workflows.html.erb
new file mode 100644 (file)
index 0000000..133fddc
--- /dev/null
@@ -0,0 +1,5 @@
+<%= render_pane 'tab_contents', to_string: true, locals: {
+    limit: 50,
+    filters: [['uuid', 'is_a', ["arvados#workflow"]]],
+       sortable_columns: { 'name' => 'workflows.name', 'description' => 'workflows.description' }
+    }.merge(local_assigns) %>
index e15cc443a93ca9062b4edb8bc99554ca42e48c2b..bb5b913dfe4b85bdb28429b422fb611dd1b59a4f 100644 (file)
@@ -1,3 +1,13 @@
+<%
+  collections = [current_obj.outputs, current_obj.docker_image].flatten.compact.uniq
+  collections_pdhs = collections.select {|x| !CollectionsHelper.match(x).nil?}.uniq.compact
+  collections_uuids = collections - collections_pdhs
+  preload_collections_for_objects collections_uuids if collections_uuids.any?
+  preload_for_pdhs collections_pdhs if collections_pdhs.any?
+
+  preload_objects_for_dataclass(Repository, [current_obj.repository], :name) if current_obj.repository
+%>
+
       <div class="container">
         <div class="row">
           <div class="col-md-5">
             <% else %>
             <table>
               <% keys = [:uuid, :modified_by_user_uuid, :created_at, :started_at, :finished_at, :container_uuid, :priority] %>
-              <% keys << :outputs if @object.uuid == current_obj.uuid %>
+              <% keys << :log_collection if @object.uuid != current_obj.uuid %>
+              <% keys << :outputs %>
               <% keys.each do |k| %>
-                <% val = current_obj.send(k) if current_obj.respond_to?(k) %>
-                <% has_val = val %>
-                <% has_val = val.andand.any? if k == :outputs %>
+                <%
+                  val = current_obj.send(k) if current_obj.respond_to?(k)
+                  if k == :outputs
+                    has_val = val.andand.any?
+                  elsif k == :log_collection and current_obj.state_label == "Running"
+                    has_val = true
+                  else
+                    has_val = val
+                  end
+                %>
                 <% if has_val %>
                 <tr>
                   <td style="padding-right: 1em">
@@ -29,6 +47,8 @@
                       <% else %>
                         <%= render partial: 'work_units/show_outputs', locals: {id: current_obj.uuid, outputs: val, align:""} %>
                       <% end %>
+                    <% elsif k == :log_collection %>
+                      <%= render partial: 'work_units/show_log_link', locals: {wu: current_obj} %>
                     <% else %>
                       <%= val %>
                     <% end %>
           </div>
           <div class="col-md-6">
             <table>
-              <% # link to repo tree/file only if the repo is readable
-                 # and the commit is a sha1...
-                 repo =
-                 (/^[0-9a-f]{40}$/ =~ current_obj.script_version and
-                 Repository.where(name: current_obj.repository).first)
-
-                 # ...and the api server provides an http:// or https:// url
+              <% # link to repo tree/file only if the repo is readable and the commit is a sha1
+                 repo = (/^[0-9a-f]{40}$/ =~ current_obj.script_version and
+                         current_obj.repository and
+                         object_for_dataclass(Repository, current_obj.repository, :name))
                  repo = nil unless repo.andand.http_fetch_url
                  %>
               <% [:script, :repository, :script_version, :supplied_script_version, :nondeterministic,
index acf19fd6b4cedc06553c2f9b4cd25d087bcebe65..8bb33b54cb7523ac3ecf5516a55e95358eb3e816 100644 (file)
@@ -1,9 +1,9 @@
 <div class="panel panel-default">
   <div class="panel-heading">
       <div class="row">
-        <div class="col-md-2" style="word-break:break-all;">
+        <div class="col-md-3" style="word-break:break-all;">
           <h4 class="panel-title">
-            <a data-toggle="collapse" href="#collapse<%= i %>">
+            <a class="component-detail-panel" data-toggle="collapse" href="#collapse<%= i %>">
               <%= current_obj.label %> <span class="caret"></span>
             </a>
           </h4>
         </div>
 
         <% if not current_obj %>
-          <div class="col-md-8"></div>
+          <div class="col-md-7"></div>
         <% else %>
-          <div class="col-md-1">
-            <%= current_obj.link_to_log %>
-          </div>
-
           <% walltime = current_obj.walltime %>
           <% cputime = current_obj.cputime %>
           <div class="col-md-3">
                 <%= current_obj.child_summary_str %>
               </span>
             </div>
-          <% elsif current_obj.is_finished? %>
-            <div class="col-md-3 text-overflow-ellipsis">
-              <% outputs = current_obj.outputs %>
-              <% if outputs.any? %>
-                <% if outputs.size == 1 %>
-                  <%= link_to_arvados_object_if_readable(outputs[0], 'Output data not available', link_text: "Output of #{current_obj.label}") %>
-                <% else %>
-                  <%= render partial: 'work_units/show_outputs', locals: {id: current_obj.uuid, outputs: outputs, align:"pull-right"} %>
-                <% end %>
-              <% else %>
-                No output.
-              <% end %>
-            </div>
           <% end %>
 
           <div class="col-md-1 pipeline-instance-spacing">
@@ -67,9 +50,9 @@
       </div>
   </div>
 
-  <div id="collapse<%= i %>" class="panel-collapse collapse <%= if expanded then 'in' end %>">
-    <div class="panel-body">
-      <%= render partial: 'work_units/show_component', locals: {wu: current_obj} %>
+  <% content_url = url_for(controller: :work_units, action: :show_child_component, id: @object.uuid, object_type: @object.class.to_s) %>
+  <div id="collapse<%=i%>" class="work-unit-component-detail panel-collapse collapse <%= if expanded then 'in' end %>" content-url="<%=content_url%>" action-data="<%={current_obj_type: current_obj.class.to_s, current_obj_uuid: current_obj.uuid, current_obj_name: current_obj.label, current_obj_parent: current_obj.parent}.to_json%>">
+    <div class="panel-body work-unit-component-detail-body">
     </div>
   </div>
 </div>
index 89233cfe003b3987a4df02e594e1ebd24155ee83..8f0c2d71eafa351082c5f7756162b928bef496ba 100644 (file)
 </p>
 
 <%# Work unit children %>
-
-<%
-  uuids = wu.children.collect {|c| c.uuid}.compact
-  if uuids.any?
-    resource_class = resource_class_for_uuid(uuids.first, friendly_name: true)
-    preload_objects_for_dataclass resource_class, uuids
-  end
-
-  collections = wu.children.collect {|j| j.outputs}.compact
-  collections = collections.flatten.uniq
-  collections.concat wu.children.collect {|j| j.docker_image}.uniq.compact
-  collections_pdhs = collections.select {|x| !(m = CollectionsHelper.match(x)).nil?}.uniq.compact
-  collections_uuids = collections - collections_pdhs
-  preload_collections_for_objects collections_uuids if collections_uuids.any?
-  preload_for_pdhs collections_pdhs if collections_pdhs.any?
-%>
-
 <% if wu.has_unreadable_children %>
   <%= render(partial: "pipeline_instances/show_components_json",
              locals: {error_name: "Unreadable components", backtrace: nil, wu: wu}) %>
 <% else %>
-  <% @descendent_count = 0 if !@descendent_count %>
   <% wu.children.each do |c| %>
-    <% @descendent_count += 1 %>
-    <%= render(partial: 'work_units/show_child', locals: {current_obj: c, i: @descendent_count, expanded: false}) %>
+    <%= render(partial: 'work_units/show_child', locals: {current_obj: c, i: (c.uuid || rand(2**128).to_s(36)), expanded: false}) %>
   <% end %>
 <% end %>
diff --git a/apps/workbench/app/views/work_units/_show_log_link.html.erb b/apps/workbench/app/views/work_units/_show_log_link.html.erb
new file mode 100644 (file)
index 0000000..a54ab32
--- /dev/null
@@ -0,0 +1,14 @@
+<% if wu.state_label.in? ["Complete", "Failed", "Cancelled"] %>
+  <% lc = wu.log_collection %>
+  <% if lc and object_readable(lc, Collection) and object_readable(wu.uuid) %>
+    <%= link_to("Log", "#{wu.uri}#Log") %>
+  <% else %>
+    Log unavailable
+  <% end %>
+<% elsif wu.state_label == "Running" %>
+  <% if object_readable(wu.uuid) %>
+    <%= link_to("Log", "#{wu.uri}#Log") %>
+  <% else %>
+    Log unavailable
+  <% end %>
+<% end %>
index 4b629c8783414ff59f3f64563b851fbbcc604e47..f2052ef0edead69473db5cfeee18518898089eff 100644 (file)
@@ -1,5 +1,5 @@
 <div class="arv-log-refresh-control"
-     data-load-throttle="15000"
+     data-load-throttle="86486400000" <%# 1001 nights %>
      ></div>
 <%=
    render(partial: 'work_units/show_component', locals: {wu: current_obj.work_unit(name)})
index 7f7854864190318171750cb498a0dc7d941156c9..7c2312c1cee57c7ffef86ad300539d8c575db5bf 100644 (file)
@@ -15,7 +15,9 @@ ArvadosWorkbench::Application.routes.draw do
   get "star" => 'actions#star', :as => :star
   get "all_processes" => 'work_units#index', :as => :all_processes
   get "choose_work_unit_templates" => 'work_unit_templates#choose', :as => :choose_work_unit_templates
-  resources :work_units
+  resources :work_units do
+    post 'show_child_component', :on => :member
+  end
   resources :nodes
   resources :humans
   resources :traits
diff --git a/apps/workbench/test/controllers/disabled_api_test.rb b/apps/workbench/test/controllers/disabled_api_test.rb
new file mode 100644 (file)
index 0000000..a41d87f
--- /dev/null
@@ -0,0 +1,63 @@
+require 'test_helper'
+require 'helpers/share_object_helper'
+
+class DisabledApiTest < ActionController::TestCase
+  test "dashboard recent processes when pipeline_instance index API is disabled" do
+    @controller = ProjectsController.new
+
+    dd = ArvadosApiClient.new_or_current.discovery.deep_dup
+    dd[:resources][:pipeline_instances][:methods].delete(:index)
+    ArvadosApiClient.any_instance.stubs(:discovery).returns(dd)
+
+    get :index, {}, session_for(:active)
+    assert_includes @response.body, "zzzzz-xvhdp-cr4runningcntnr" # expect crs
+    assert_not_includes @response.body, "zzzzz-d1hrv-"   # expect no pipelines
+  end
+
+  [
+    [:jobs, JobsController.new],
+    [:job_tasks, JobTasksController.new],
+    [:pipeline_instances, PipelineInstancesController.new],
+    [:pipeline_templates, PipelineTemplatesController.new],
+  ].each do |ctrl_name, ctrl|
+    test "#{ctrl_name} index page when API is disabled" do
+      @controller = ctrl
+
+      dd = ArvadosApiClient.new_or_current.discovery.deep_dup
+      dd[:resources][ctrl_name][:methods].delete(:index)
+      ArvadosApiClient.any_instance.stubs(:discovery).returns(dd)
+
+      get :index, {}, session_for(:active)
+      assert_response 404
+    end
+  end
+
+  [
+    :active,
+    nil,
+  ].each do |user|
+    test "project tabs as user #{user} when pipeline related index APIs are disabled" do
+      @controller = ProjectsController.new
+
+      Rails.configuration.anonymous_user_token = api_fixture('api_client_authorizations')['anonymous']['api_token']
+
+      dd = ArvadosApiClient.new_or_current.discovery.deep_dup
+      dd[:resources][:pipeline_templates][:methods].delete(:index)
+      ArvadosApiClient.any_instance.stubs(:discovery).returns(dd)
+
+      proj_uuid = api_fixture('groups')['anonymously_accessible_project']['uuid']
+
+      if user
+        get(:show, {id: proj_uuid}, session_for(user))
+      else
+        get(:show, {id: proj_uuid})
+      end
+
+      resp = @response.body
+      assert_includes resp, "href=\"#Data_collections\""
+      assert_includes resp, "href=\"#Pipelines_and_processes\""
+      assert_includes resp, "href=\"#Workflows\""
+      assert_not_includes resp, "href=\"#Pipeline_templates\""
+    end
+  end
+end
index f9e324ca41f84377cf9b4cb6bc284e58b3abebf2..d038222cf0cf58278818bd087e288a4e1c11b52c 100644 (file)
@@ -46,7 +46,7 @@ class PipelineTest < DiagnosticsTest
       page.assert_selector 'a,button', text: 'Pause'
 
       # Wait for pipeline run to complete
-      wait_until_page_has 'Complete', pipeline_config['max_wait_seconds']
+      wait_until_page_has 'completed', pipeline_config['max_wait_seconds']
     end
   end
 
index c7433bb247450464fb42fa780e309ce09fdb27b7..3587721edae7bc6e96778efceaaedfadddbeacd3 100644 (file)
@@ -24,9 +24,12 @@ class DiagnosticsTest < ActionDispatch::IntegrationTest
   # Looks for the text_to_look_for for up to the max_time provided
   def wait_until_page_has text_to_look_for, max_time=30
     max_time = 30 if (!max_time || (max_time.to_s != max_time.to_i.to_s))
+    text_found = false
     Timeout.timeout(max_time) do
-      loop until page.has_text?(text_to_look_for)
+      until text_found do
+        visit_page_with_token 'active', current_path
+        text_found = has_text?(text_to_look_for)
+      end
     end
   end
-
 end
index e39d6f4dbf66576df928df93b7cf43030240d3f2..7708ffdc0a42e11e63e7a5f8145e7c2396ef4742 100644 (file)
@@ -154,7 +154,7 @@ class JobsTest < ActionDispatch::IntegrationTest
 
       if readable
         click_link('component1')
-        within('#collapse1') do
+        within('.panel-collapse') do
           assert(has_text? component1['uuid'])
           assert(has_text? component1['script_version'])
           assert(has_text? 'script_parameters')
index d97850c991f292eca07a8040a3a65c2b2b7d99f2..171580bbaa2bc9816a9ba1061e40142d0487c8e9 100644 (file)
@@ -16,14 +16,21 @@ class PipelineInstancesTest < ActionDispatch::IntegrationTest
     # Note: Even with all this help, phantomjs seem to behave badly
     # when parsing timestamps on the other side of a DST transition.
     # See skipped tests below.
+
+    # In some locales (e.g., en_CA.UTF-8) Firefox can't parse what its
+    # own toLocaleString() puts out.
+    t.sub!(/(\d\d\d\d)-(\d\d)-(\d\d)/, '\2/\3/\1')
+
     if /(\d+:\d+ [AP]M) (\d+\/\d+\/\d+)/ =~ t
       # Currently dates.js renders timestamps as
       # '{t.toLocaleTimeString()} {t.toLocaleDateString()}' which even
-      # browsers can't make sense of. First we need to flip it around
-      # so it looks like what toLocaleString() would have made.
+      # en_US browsers can't make sense of. First we need to flip it
+      # around so it looks like what toLocaleString() would have made.
       t = $~[2] + ', ' + $~[1]
     end
-    DateTime.parse(page.evaluate_script "new Date('#{t}').toUTCString()").to_time
+
+    utc = page.evaluate_script("new Date('#{t}').toUTCString()")
+    DateTime.parse(utc).to_time
   end
 
   if false
index b1d5a2158909d68cae12ab58512168df8167fbaa..f04616dd383ac49f927a544fb2e7d372c30b8acb 100644 (file)
@@ -207,4 +207,29 @@ class WorkUnitsTest < ActionDispatch::IntegrationTest
       assert_text(expect_log_text)
     end
   end
+
+  [
+    ['jobs', 'active', 'running_job_with_components', 'component1', '/jobs/zzzzz-8i9sb-jyq01m7in1jlofj#Log'],
+    ['pipeline_instances', 'active', 'pipeline_in_running_state', 'foo', '/jobs/zzzzz-8i9sb-pshmckwoma9plh7#Log'],
+    ['pipeline_instances', nil, 'pipeline_in_publicly_accessible_project_but_other_objects_elsewhere', 'foo', 'Log unavailable'],
+  ].each do |type, token, fixture, child, log_link|
+    test "link_to_log for #{fixture} for #{token}" do
+      obj = api_fixture(type)[fixture]
+      if token
+        visit page_with_token token, "/#{type}/#{obj['uuid']}"
+      else
+        Rails.configuration.anonymous_user_token =
+          api_fixture("api_client_authorizations", "anonymous", "api_token")
+        visit "/#{type}/#{obj['uuid']}"
+      end
+
+      click_link(child)
+
+      if token
+        assert_selector "a[href=\"#{log_link}\"]"
+      else
+        assert_text log_link
+      end
+    end
+  end
 end
diff --git a/apps/workbench/test/unit/disabled_api_test.rb b/apps/workbench/test/unit/disabled_api_test.rb
new file mode 100644 (file)
index 0000000..52e3bd1
--- /dev/null
@@ -0,0 +1,15 @@
+require 'test_helper'
+
+class DisabledApiTest < ActiveSupport::TestCase
+  test 'Job.creatable? reflects whether jobs.create API is enabled' do
+    use_token(:active) do
+      assert(Job.creatable?)
+    end
+    dd = ArvadosApiClient.new_or_current.discovery.deep_dup
+    dd[:resources][:jobs][:methods].delete(:create)
+    ArvadosApiClient.any_instance.stubs(:discovery).returns(dd)
+    use_token(:active) do
+      refute(Job.creatable?)
+    end
+  end
+end
index e59d30d19a9ed0b3d9087150d76fc5abdb18a273..0ff38140e1a6f976ffc5b0da27e73b43415b4d54 100644 (file)
@@ -83,32 +83,6 @@ class WorkUnitTest < ActiveSupport::TestCase
     end
   end
 
-  [
-    [Job, 'active', 'running_job_with_components', true],
-    [Job, 'active', 'queued', false],
-    [Job, nil, 'completed_job_in_publicly_accessible_project', true],
-    [Job, 'active', 'completed_job_in_publicly_accessible_project', true],
-    [PipelineInstance, 'active', 'pipeline_in_running_state', true],  # no log, but while running the log link points to pi Log tab
-    [PipelineInstance, nil, 'pipeline_in_publicly_accessible_project_but_other_objects_elsewhere', false],
-    [PipelineInstance, 'active', 'pipeline_in_publicly_accessible_project_but_other_objects_elsewhere', false], #no log for completed pi
-    [Job, nil, 'job_in_publicly_accessible_project_but_other_objects_elsewhere', false, "Log unavailable"],
-  ].each do |type, token, fixture, has_log, log_link|
-    test "link_to_log for #{fixture} for #{token}" do
-      use_token token if token
-      obj = find_fixture(type, fixture)
-      wu = obj.work_unit
-
-      link = "#{wu.uri}#Log" if has_log
-      link_to_log = wu.link_to_log
-
-      if has_log
-        assert_includes link_to_log, link
-      else
-        assert_equal log_link, link_to_log
-      end
-    end
-  end
-
   test 'can_cancel?' do
     use_token 'active' do
       assert find_fixture(Job, 'running').work_unit.can_cancel?
index 051c8bd98bd379cf29752f08ea1d88284706d60e..729855a8806faa938bda6e9d3a95a3159eca08b5 100755 (executable)
@@ -2,39 +2,61 @@
 
 set -e
 
-# NOTE: This package name detection will only work on Debian.
-# If this postinst script ever starts doing work on Red Hat,
-# we'll need to adapt this code accordingly.
-script="$(basename "${0}")"
-pkg="${script%.postinst}"
-systemd_unit="${pkg}.service"
+if [ "%{name}" != "%\{name\}" ]; then
+    # Red Hat ("%{...}" is interpolated at package build time)
+    pkg="%{name}"
+    pkgtype=rpm
+    prefix="${RPM_INSTALL_PREFIX}"
+else
+    # Debian
+    script="$(basename "${0}")"
+    pkg="${script%.postinst}"
+    pkgtype=deb
+    prefix=/usr
+fi
 
-case "${1}" in
-    configure)
-        if [ -d /lib/systemd/system ]
-        then
-            # Python packages put all data files in /usr, so we copy
-            # them to /lib at install time.
-            py_unit="/usr/share/doc/${pkg}/${pkg}.service"
-            if [ -e "${py_unit}" ]
-            then
-                cp "${py_unit}" /lib/systemd/system/
+case "${pkgtype}-${1}" in
+    deb-configure | rpm-1)
+        dest_dir="/lib/systemd/system"
+        if ! [ -d "${dest_dir}" ]; then
+            exit 0
+        fi
+
+        # Find the unit file we need to install.
+        unit_file="${pkg}.service"
+        for dir in \
+            "${prefix}/share/doc/${pkg}" \
+            "${dest_dir}"; do
+            if [ -e "${dir}/${unit_file}" ]; then
+                src_dir="${dir}"
+                break
             fi
+        done
+        if [ -z "${src_dir}" ]; then
+            echo >&2 "WARNING: postinst script did not find ${unit_file} anywhere."
+            exit 0
+        fi
+
+        # Install/update the unit file if necessary.
+        if [ "${src_dir}" != "${dest_dir}" ]; then
+            cp "${src_dir}/${unit_file}" "${dest_dir}/" || exit 0
         fi
 
+        # Enable service, and make sure systemd re-reads the unit
+        # file, in case we changed it.
         if [ -e /run/systemd/system ]; then
-            eval "$(systemctl -p UnitFileState show "${systemd_unit}")"
+            systemctl daemon-reload || true
+            eval "$(systemctl -p UnitFileState show "${pkg}")"
             case "${UnitFileState}" in
                 disabled)
                     # Failing to enable or start the service is not a
                     # package error, so don't let errors here
                     # propagate up.
-                    systemctl enable "${systemd_unit}" || true
-                    systemctl start "${systemd_unit}" || true
+                    systemctl enable "${pkg}" || true
+                    systemctl start "${pkg}" || true
                     ;;
                 enabled)
-                    systemctl daemon-reload || true
-                    systemctl reload-or-try-restart "${systemd_unit}" || true
+                    systemctl reload-or-try-restart "${pkg}" || true
                     ;;
             esac
         fi
index c6ec18ca106cb1bba11e761363715fb1ce40c0d2..26baa62aa1b74266fd853062e5cb25bb4ec6a93d 100755 (executable)
@@ -2,26 +2,29 @@
 
 set -e
 
-# NOTE: This package name detection will only work on Debian.
-# If this prerm script ever starts doing work on Red Hat,
-# we'll need to adapt this code accordingly.
-script="$(basename "${0}")"
-pkg="${script%.prerm}"
-systemd_unit="${pkg}.service"
+if [ "%{name}" != "%\{name\}" ]; then
+    # Red Hat ("%{...}" is interpolated at package build time)
+    pkg="%{name}"
+    pkgtype=rpm
+    prefix="${RPM_INSTALL_PREFIX}"
+else
+    # Debian
+    script="$(basename "${0}")"
+    pkg="${script%.prerm}"
+    pkgtype=deb
+    prefix=/usr
+fi
 
-case "${1}" in
-    remove)
+case "${pkgtype}-${1}" in
+    deb-remove | rpm-0)
         if [ -e /run/systemd/system ]; then
-            systemctl stop "${systemd_unit}" || true
-            systemctl disable "${systemd_unit}" || true
+            systemctl stop "${pkg}" || true
+            systemctl disable "${pkg}" || true
         fi
-
-        # Unit files from Python packages get installed by postinst so
-        # we have to remove them explicitly here.
-        py_unit="/usr/share/doc/${pkg}/${pkg}.service"
-        if [ -e "${py_unit}" ]
-        then
-            rm "/lib/systemd/system/${pkg}.service" || true
+        if [ -e "${prefix}/share/doc/${pkg}/${pkg}.service" ]; then
+            # Unit files from Python packages get installed by
+            # postinst so we have to remove them explicitly here.
+            rm "/lib/systemd/system/${pkg}/${pkg}.service" || true
         fi
         ;;
 esac
diff --git a/build/package-testing/test-package-python-arvados-cwl-runner.sh b/build/package-testing/test-package-python-arvados-cwl-runner.sh
new file mode 120000 (symlink)
index 0000000..61e61b1
--- /dev/null
@@ -0,0 +1 @@
+test-package-python27-python-arvados-cwl-runner.sh
\ No newline at end of file
diff --git a/build/package-testing/test-package-python-arvados-fuse.sh b/build/package-testing/test-package-python-arvados-fuse.sh
new file mode 120000 (symlink)
index 0000000..3b9232c
--- /dev/null
@@ -0,0 +1 @@
+test-package-python27-python-arvados-fuse.sh
\ No newline at end of file
diff --git a/build/package-testing/test-package-python-arvados-python-client.sh b/build/package-testing/test-package-python-arvados-python-client.sh
new file mode 120000 (symlink)
index 0000000..8a4d0ea
--- /dev/null
@@ -0,0 +1 @@
+test-package-python27-python-arvados-python-client.sh
\ No newline at end of file
diff --git a/build/package-testing/test-package-python27-python-arvados-cwl-runner.sh b/build/package-testing/test-package-python27-python-arvados-cwl-runner.sh
new file mode 100755 (executable)
index 0000000..9d56435
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+exec python <<EOF
+import arvados_cwl
+print "arvados-cwl-runner version", arvados_cwl.__version__
+EOF
index 0772fbf8e470301bb9e0f1322634de6e19f88577..3e8c7cc804f067a630ae0f4853488166b25b0677 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-exec python <<EOF
+exec python2.7 <<EOF
 import arvados
 print "Successfully imported arvados"
 EOF
index d03169457e7d3a1a33a535e50deed79b3f398828..a7dc30cfaedce168fab2ac3ec2d70d3e70bf297b 100755 (executable)
@@ -125,7 +125,7 @@ timer_reset
 # clean up the docker build environment
 cd "$WORKSPACE"
 
-tools/arvbox/bin/arvbox rebuild localdemo
+tools/arvbox/bin/arvbox build localdemo
 ECODE=$?
 
 if [[ "$ECODE" != "0" ]]; then
index 22f6f54288741d2ed4723e9260234b469fb24591..556ac4ea194755deee1de8f8a98001cf2ae571b5 100755 (executable)
@@ -5,8 +5,8 @@ function usage {
     echo >&2 "usage: $0 [options]"
     echo >&2
     echo >&2 "$0 options:"
-    echo >&2 "  -t, --tags [csv_tags]         comma separated tags"
     echo >&2 "  -u, --upload                  Upload the images (docker push)"
+    echo >&2 "  --no-cache                    Don't use build cache"
     echo >&2 "  -h, --help                    Display this help and exit"
     echo >&2
     echo >&2 "  If no options are given, just builds the images."
@@ -16,7 +16,7 @@ upload=false
 
 # NOTE: This requires GNU getopt (part of the util-linux package on Debian-based distros).
 TEMP=`getopt -o hut: \
-    --long help,upload,tags: \
+    --long help,upload,no-cache,tags: \
     -n "$0" -- "$@"`
 
 if [ $? != 0 ] ; then echo "Use -h for help"; exit 1 ; fi
@@ -30,6 +30,10 @@ do
             upload=true
             shift
             ;;
+        --no-cache)
+            NOCACHE=--no-cache
+            shift
+            ;;
         -t | --tags)
             case "$2" in
                 "")
@@ -38,7 +42,7 @@ do
                   exit 1
                   ;;
                 *)
-                  tags=$2;
+                  echo "WARNING: --tags is deprecated and doesn't do anything";
                   shift 2
                   ;;
             esac
@@ -66,14 +70,6 @@ COLUMNS=80
 . $WORKSPACE/build/run-library.sh
 
 docker_push () {
-    if [[ ! -z "$tags" ]]
-    then
-        for tag in $( echo $tags|tr "," " " )
-        do
-             $DOCKER tag $1 $1:$tag
-        done
-    fi
-
     # Sometimes docker push fails; retry it a few times if necessary.
     for i in `seq 1 5`; do
         $DOCKER push $*
@@ -118,13 +114,28 @@ timer_reset
 
 # clean up the docker build environment
 cd "$WORKSPACE"
-cd docker/jobs
-if [[ ! -z "$tags" ]]; then
-    docker build --build-arg COMMIT=${tags/,*/} -t arvados/jobs .
+
+python_sdk_ts=$(cd sdk/python && timestamp_from_git)
+cwl_runner_ts=$(cd sdk/cwl && timestamp_from_git)
+
+python_sdk_version=$(cd sdk/python && nohash_version_from_git 0.1)-2
+cwl_runner_version=$(cd sdk/cwl && nohash_version_from_git 1.0)-3
+
+if [[ $python_sdk_ts -gt $cwl_runner_ts ]]; then
+    cwl_runner_version=$(cd sdk/python && nohash_version_from_git 1.0)-3
+    gittag=$(git log --first-parent --max-count=1 --format=format:%H sdk/python)
 else
-    docker build -t arvados/jobs .
+    gittag=$(git log --first-parent --max-count=1 --format=format:%H sdk/cwl)
 fi
 
+echo cwl_runner_version $cwl_runner_version python_sdk_version $python_sdk_version
+
+cd docker/jobs
+docker build $NOCACHE \
+       --build-arg python_sdk_version=$python_sdk_version \
+       --build-arg cwl_runner_version=$cwl_runner_version \
+       -t arvados/jobs:$gittag .
+
 ECODE=$?
 
 if [[ "$ECODE" != "0" ]]; then
@@ -134,19 +145,43 @@ fi
 checkexit $ECODE "docker build"
 title "docker build complete (`timer`)"
 
+if [[ "$ECODE" != "0" ]]; then
+  exit_cleanly
+fi
+
+timer_reset
+
+if docker --version |grep " 1\.[0-9]\." ; then
+    # Docker version prior 1.10 require -f flag
+    # -f flag removed in Docker 1.12
+    FORCE=-f
+fi
+
+docker tag $FORCE arvados/jobs:$gittag arvados/jobs:latest
+
+ECODE=$?
+
+if [[ "$ECODE" != "0" ]]; then
+    EXITCODE=$(($EXITCODE + $ECODE))
+fi
+
+checkexit $ECODE "docker tag"
+title "docker tag complete (`timer`)"
+
 title "uploading images"
 
 timer_reset
 
 if [[ "$ECODE" != "0" ]]; then
-    title "upload arvados images SKIPPED because build failed"
+    title "upload arvados images SKIPPED because build or tag failed"
 else
     if [[ $upload == true ]]; then
         ## 20150526 nico -- *sometimes* dockerhub needs re-login
         ## even though credentials are already in .dockercfg
         docker login -u arvados
 
-        docker_push arvados/jobs
+        docker_push arvados/jobs:$gittag
+        docker_push arvados/jobs:latest
         title "upload arvados images finished (`timer`)"
     else
         title "upload arvados images SKIPPED because no --upload option set (`timer`)"
index 65c928239f428ca8810fe7ec8a7866d3c5b45399..320f9d445c3a052a62bf5b8560b2080c98b06904 100755 (executable)
@@ -104,7 +104,7 @@ case "$TARGET" in
             ciso8601 pycrypto backports.ssl_match_hostname llfuse==0.41.1 \
             'pycurl<7.21.5' contextlib2 pyyaml 'rdflib>=4.2.0' \
             shellescape mistune typing avro ruamel.ordereddict
-            cachecontrol)
+            cachecontrol requests)
         PYTHON3_BACKPORTS=(docker-py==1.7.2 six requests websocket-client)
         ;;
     debian8)
@@ -126,7 +126,7 @@ case "$TARGET" in
             ciso8601 pycrypto backports.ssl_match_hostname llfuse==0.41.1 \
             contextlib2 'pycurl<7.21.5' pyyaml 'rdflib>=4.2.0' \
             shellescape mistune typing avro isodate ruamel.ordereddict
-            cachecontrol)
+            cachecontrol requests)
         PYTHON3_BACKPORTS=(docker-py==1.7.2 six requests websocket-client)
         ;;
     ubuntu1404)
@@ -172,7 +172,7 @@ case "$TARGET" in
             oauth2client==1.5.2 pyasn1==0.1.7 pyasn1-modules==0.0.5 \
             rsa uritemplate httplib2 ws4py pykka  \
             ciso8601 pycrypto 'pycurl<7.21.5' \
-            python-daemon llfuse==0.41.1 'pbr<1.0' pyyaml \
+            python-daemon==2.1.1 llfuse==0.41.1 'pbr<1.0' pyyaml \
             'rdflib>=4.2.0' shellescape mistune typing avro \
             isodate pyparsing sparqlwrapper html5lib==0.9999999 keepalive \
             ruamel.ordereddict cachecontrol)
@@ -431,6 +431,8 @@ package_go_binary tools/keep-block-check keep-block-check \
     "Verify that all data from one set of Keep servers to another was copied"
 package_go_binary tools/keep-rsync keep-rsync \
     "Copy all data from one set of Keep servers to another"
+package_go_binary tools/keep-exercise keep-exercise \
+    "Performance testing tool for Arvados Keep"
 
 # The Python SDK
 # Please resist the temptation to add --no-python-fix-name to the fpm call here
@@ -446,7 +448,7 @@ fpm_build $WORKSPACE/sdk/python "${PYTHON2_PKG_PREFIX}-arvados-python-client" 'C
 # cwl-runner
 cd $WORKSPACE/packages/$TARGET
 rm -rf "$WORKSPACE/sdk/cwl/build"
-fpm_build $WORKSPACE/sdk/cwl "${PYTHON2_PKG_PREFIX}-arvados-cwl-runner" 'Curoverse, Inc.' 'python' "$(awk '($1 == "Version:"){print $2}' $WORKSPACE/sdk/cwl/arvados_cwl_runner.egg-info/PKG-INFO)" "--url=https://arvados.org" "--description=The Arvados CWL runner" --iteration 3
+fpm_build $WORKSPACE/sdk/cwl "${PYTHON2_PKG_PREFIX}-arvados-cwl-runner" 'Curoverse, Inc.' 'python' "$(awk '($1 == "Version:"){print $2}' $WORKSPACE/sdk/cwl/arvados_cwl_runner.egg-info/PKG-INFO)" "--url=https://arvados.org" "--description=The Arvados CWL runner" --depends "${PYTHON2_PKG_PREFIX}-setuptools" --iteration 3
 
 fpm_build lockfile "" "" python 0.12.2 --epoch 1
 
@@ -476,7 +478,7 @@ fpm_build ruamel.yaml "" "" python 0.12.4 --python-setup-py-arguments "--single-
 fpm_build cwltest "" "" python 1.0.20160907111242
 
 # And for cwltool we have the same problem as for schema_salad. Ward, 2016-03-17
-fpm_build cwltool "" "" python 1.0.20161007181528
+fpm_build cwltool "" "" python 1.0.20161107145355
 
 # FPM eats the trailing .0 in the python-rdflib-jsonld package when built with 'rdflib-jsonld>=0.3.0'. Force the version. Ward, 2016-03-25
 fpm_build rdflib-jsonld "" "" python 0.3.0
index 73a99dabd7b3626582a418040e1ce6713a68ada9..f0b120f6bf1e4e011a69f9f811ee67ad55624938 100755 (executable)
@@ -35,13 +35,19 @@ format_last_commit_here() {
 version_from_git() {
   # Generates a version number from the git log for the current working
   # directory, and writes it to stdout.
-  local git_ts git_hash
+  local git_ts git_hash prefix
+  if [[ -n "$1" ]] ; then
+      prefix="$1"
+  else
+      prefix="0.1"
+  fi
+
   declare $(format_last_commit_here "git_ts=%ct git_hash=%h")
-  echo "0.1.$(date -ud "@$git_ts" +%Y%m%d%H%M%S).$git_hash"
+  echo "${prefix}.$(date -ud "@$git_ts" +%Y%m%d%H%M%S).$git_hash"
 }
 
 nohash_version_from_git() {
-    version_from_git | cut -d. -f1-3
+    version_from_git $1 | cut -d. -f1-3
 }
 
 timestamp_from_git() {
index ef84a2f41cab1d63781db43389a6d03cc8a3b944..d08568cde58b97bdede5b430eda4f0b788f4e3ce 100755 (executable)
@@ -93,6 +93,7 @@ sdk/go/streamer
 sdk/go/crunchrunner
 sdk/cwl
 tools/crunchstat-summary
+tools/keep-exercise
 tools/keep-rsync
 tools/keep-block-check
 
@@ -164,8 +165,8 @@ sanity_checks() {
     echo -n 'go: '
     go version \
         || fatal "No go binary. See http://golang.org/doc/install"
-    [[ $(go version) =~ go1.([0-9]+) ]] && [[ ${BASH_REMATCH[1]} -ge 6 ]] \
-        || fatal "Go >= 1.6 required. See http://golang.org/doc/install"
+    [[ $(go version) =~ go1.([0-9]+) ]] && [[ ${BASH_REMATCH[1]} -ge 7 ]] \
+        || fatal "Go >= 1.7 required. See http://golang.org/doc/install"
     echo -n 'gcc: '
     gcc --version | egrep ^gcc \
         || fatal "No gcc. Try: apt-get install build-essential"
@@ -770,8 +771,9 @@ gostuff=(
     services/crunch-dispatch-local
     services/crunch-dispatch-slurm
     services/crunch-run
-    tools/keep-rsync
     tools/keep-block-check
+    tools/keep-exercise
+    tools/keep-rsync
     )
 for g in "${gostuff[@]}"
 do
index 5d7f553fecad9d4383e7326cabfd1419612dd9e2..ff2addf8fd9e6f874ac1a96a4025afef2afec326 100755 (executable)
@@ -1,15 +1,30 @@
 #!/usr/bin/env python
 
-# Crunch script integration for running arvados-cwl-runner (importing
-# arvados_cwl module) inside a crunch job.
-#
+# Crunch script integration for running arvados-cwl-runner inside a crunch job.
+
+import arvados_cwl
+import sys
+
+try:
+    # Use the crunch script defined in the arvados_cwl package.  This helps
+    # prevent the crunch script from going out of sync with the rest of the
+    # arvados_cwl package.
+    import arvados_cwl.crunch_script
+    arvados_cwl.crunch_script.run()
+    sys.exit()
+except ImportError:
+    pass
+
+# When running against an older arvados-cwl-runner package without
+# arvados_cwl.crunch_script, fall back to the old code.
+
+
 # This gets the job record, transforms the script parameters into a valid CWL
 # input object, then executes the CWL runner to run the underlying workflow or
 # tool.  When the workflow completes, record the output object in an output
 # collection for this runner job.
 
 import arvados
-import arvados_cwl
 import arvados.collection
 import arvados.util
 import cwltool.main
index 5ed5af5cb58c3757fe36758b5d8bea8fa6d4413c..96aea34d36173a07c7952480d1fd59dcf3f90409 100644 (file)
@@ -78,78 +78,67 @@ navbar:
       - sdk/index.html.textile.liquid
     - Python:
       - sdk/python/sdk-python.html.textile.liquid
+      - sdk/python/example.html.textile.liquid
       - sdk/python/python.html.textile.liquid
       - sdk/python/crunch-utility-libraries.html.textile.liquid
       - sdk/python/events.html.textile.liquid
+    - CLI:
+      - sdk/cli/install.html.textile.liquid
+      - sdk/cli/index.html.textile.liquid
+      - sdk/cli/reference.html.textile.liquid
+      - sdk/cli/subcommands.html.textile.liquid
+    - Go:
+      - sdk/go/index.html.textile.liquid
+      - sdk/go/example.html.textile.liquid
     - Perl:
       - sdk/perl/index.html.textile.liquid
+      - sdk/perl/example.html.textile.liquid
     - Ruby:
       - sdk/ruby/index.html.textile.liquid
+      - sdk/ruby/example.html.textile.liquid
     - Java:
       - sdk/java/index.html.textile.liquid
-    - Go:
-      - sdk/go/index.html.textile.liquid
-    - CLI:
-      - sdk/cli/index.html.textile.liquid
-      - sdk/cli/install.html.textile.liquid
-      - sdk/cli/reference.html.textile.liquid
-      - sdk/cli/subcommands.html.textile.liquid
+      - sdk/java/example.html.textile.liquid
   api:
     - Concepts:
       - api/index.html.textile.liquid
-      - api/authentication.html.textile.liquid
+      - api/tokens.html.textile.liquid
+      - api/requests.html.textile.liquid
       - api/methods.html.textile.liquid
       - api/resources.html.textile.liquid
-      - api/crunch-scripts.html.textile.liquid
       - api/permission-model.html.textile.liquid
-    - API Methods:
+      - api/storage.html.textile.liquid
+      - api/execution.html.textile.liquid
+    - Permission and authentication:
       - api/methods/api_client_authorizations.html.textile.liquid
       - api/methods/api_clients.html.textile.liquid
       - api/methods/authorized_keys.html.textile.liquid
-      - api/methods/collections.html.textile.liquid
-      - api/methods/container_requests.html.textile.liquid
-      - api/methods/containers.html.textile.liquid
       - api/methods/groups.html.textile.liquid
-      - api/methods/humans.html.textile.liquid
-      - api/methods/jobs.html.textile.liquid
-      - api/methods/job_tasks.html.textile.liquid
-      - api/methods/keep_disks.html.textile.liquid
+      - api/methods/users.html.textile.liquid
+    - System resources:
       - api/methods/keep_services.html.textile.liquid
       - api/methods/links.html.textile.liquid
       - api/methods/logs.html.textile.liquid
       - api/methods/nodes.html.textile.liquid
+      - api/methods/virtual_machines.html.textile.liquid
+      - api/methods/keep_disks.html.textile.liquid
+    - Data management:
+      - api/methods/collections.html.textile.liquid
+      - api/methods/repositories.html.textile.liquid
+    - Container engine:
+      - api/methods/container_requests.html.textile.liquid
+      - api/methods/containers.html.textile.liquid
+      - api/methods/workflows.html.textile.liquid
+    - Jobs engine (deprecated):
+      - api/crunch-scripts.html.textile.liquid
+      - api/methods/jobs.html.textile.liquid
+      - api/methods/job_tasks.html.textile.liquid
       - api/methods/pipeline_instances.html.textile.liquid
       - api/methods/pipeline_templates.html.textile.liquid
-      - api/methods/repositories.html.textile.liquid
+    - Metadata for bioinformatics:
+      - api/methods/humans.html.textile.liquid
       - api/methods/specimens.html.textile.liquid
       - api/methods/traits.html.textile.liquid
-      - api/methods/users.html.textile.liquid
-      - api/methods/virtual_machines.html.textile.liquid
-      - api/methods/workflows.html.textile.liquid
-    - Schema:
-      - api/schema/ApiClientAuthorization.html.textile.liquid
-      - api/schema/ApiClient.html.textile.liquid
-      - api/schema/AuthorizedKey.html.textile.liquid
-      - api/schema/Collection.html.textile.liquid
-      - api/schema/Container.html.textile.liquid
-      - api/schema/ContainerRequest.html.textile.liquid
-      - api/schema/Group.html.textile.liquid
-      - api/schema/Human.html.textile.liquid
-      - api/schema/Job.html.textile.liquid
-      - api/schema/JobTask.html.textile.liquid
-      - api/schema/KeepDisk.html.textile.liquid
-      - api/schema/KeepService.html.textile.liquid
-      - api/schema/Link.html.textile.liquid
-      - api/schema/Log.html.textile.liquid
-      - api/schema/Node.html.textile.liquid
-      - api/schema/PipelineInstance.html.textile.liquid
-      - api/schema/PipelineTemplate.html.textile.liquid
-      - api/schema/Repository.html.textile.liquid
-      - api/schema/Specimen.html.textile.liquid
-      - api/schema/Trait.html.textile.liquid
-      - api/schema/User.html.textile.liquid
-      - api/schema/VirtualMachine.html.textile.liquid
-      - api/schema/Workflow.html.textile.liquid
   installguide:
     - Overview:
       - install/index.html.textile.liquid
@@ -168,12 +157,12 @@ navbar:
       - install/configure-azure-blob-storage.html.textile.liquid
       - install/install-keepproxy.html.textile.liquid
       - install/install-keep-web.html.textile.liquid
-    - Install Crunch v2 on SLURM:
+    - Containers API support on SLURM:
       - install/crunch2-slurm/install-prerequisites.html.textile.liquid
       - install/crunch2-slurm/install-compute-node.html.textile.liquid
       - install/crunch2-slurm/install-dispatch.html.textile.liquid
       - install/crunch2-slurm/install-test.html.textile.liquid
-    - Install Crunch v1:
+    - Jobs API support (deprecated):
       - install/install-crunch-dispatch.html.textile.liquid
       - install/install-compute-node.html.textile.liquid
     - Helpful hints:
index 06bfb4f5da71dbfe10c2ccb39484cf8f5ebd34ea..849db42e47827c7a3cc2ddea8a28f36d3434979e 100644 (file)
@@ -6,5 +6,6 @@ table(table table-bordered table-condensed).
 |_. Key|_. Type|_. Description|_. Notes|
 |ram|integer|Number of ram bytes to be used to run this process.|Optional. However, a ContainerRequest that is in "Committed" state must provide this.|
 |vcpus|integer|Number of cores to be used to run this process.|Optional. However, a ContainerRequest that is in "Committed" state must provide this.|
+|keep_cache_ram|integer|Number of keep cache bytes to be used to run this process.|Optional.|
 |API|boolean|When set, ARVADOS_API_HOST and ARVADOS_API_TOKEN will be set, and container will have networking enabled to access the Arvados API server.|Optional.|
 |partition|array of strings|Specify the names of one or more compute partitions that may run this container.  If not provided, the system chooses where to run the container.|Optional.|
diff --git a/doc/_includes/_crunch1only_begin.liquid b/doc/_includes/_crunch1only_begin.liquid
new file mode 100644 (file)
index 0000000..5c08d1e
--- /dev/null
@@ -0,0 +1,2 @@
+{% include 'notebox_begin_warning' %}
+This section assumes the legacy Jobs API is available. Some newer installations have already disabled the Jobs API in favor of the Containers API.
diff --git a/doc/_includes/_crunch1only_end.liquid b/doc/_includes/_crunch1only_end.liquid
new file mode 100644 (file)
index 0000000..f8b437a
--- /dev/null
@@ -0,0 +1 @@
+{% include 'notebox_end' %}
index 5671a54ad58b2ae21e8443a683d2677224df6deb..6b7ec90e6394e4a2105ae4453d2648f56bfb7cc3 100644 (file)
@@ -3,39 +3,26 @@ h2. Configure the Docker cleaner
 The arvados-docker-cleaner program removes least recently used Docker images as needed to keep disk usage below a configured limit.
 
 {% include 'notebox_begin' %}
-This also removes all containers as soon as they exit, as if they were run with @docker run --rm@. If you need to debug or inspect containers after they stop, temporarily stop arvados-docker-cleaner or run it with @--remove-stopped-containers never@.
+This also removes all containers as soon as they exit, as if they were run with @docker run --rm@. If you need to debug or inspect containers after they stop, temporarily stop arvados-docker-cleaner or configure it with @"RemoveStoppedContainers":"never"@.
 {% include 'notebox_end' %}
 
-Create a file @/etc/systemd/system/arvados-docker-cleaner.service@ in an editor.  Include the text below as its contents.  Make sure to edit the @ExecStart@ line appropriately for your compute node.
+Create a file @/etc/arvados/docker-cleaner/docker-cleaner.json@ in an editor, with the following contents.
 
 <notextile>
-<pre><code>[Service]
-# Most deployments will want a quota that's at least 10G.  From there,
-# a larger quota can help reduce compute overhead by preventing reloading
-# the same Docker image repeatedly, but will leave less space for other
-# files on the same storage (usually Docker volumes).  Make sure the quota
-# is less than the total space available for Docker images.
-# If your deployment uses a Python 3 Software Collection, uncomment the
-# ExecStart line below, and delete the following one:
-# ExecStart=scl enable python33 "python3 -m arvados_docker.cleaner --quota <span class="userinput">20G</span>"
-ExecStart=python3 -m arvados_docker.cleaner --quota <span class="userinput">20G</span>
-Restart=always
-RestartPreventExitStatus=2
-
-[Install]
-WantedBy=default.target
-
-[Unit]
-After=docker.service
+<pre><code>{
+    "Quota": "<span class="userinput">10G</span>",
+    "RemoveStoppedContainers": "always"
+}
 </code></pre>
 </notextile>
 
-Then enable and start the service:
+*Choosing a quota:* Most deployments will want a quota that's at least 10G.  From there, a larger quota can help reduce compute overhead by preventing reloading the same Docker image repeatedly, but will leave less space for other files on the same storage (usually Docker volumes).  Make sure the quota is less than the total space available for Docker images.
+
+Restart the service after updating the configuration file.
 
 <notextile>
-<pre><code>~$ <span class="userinput">sudo systemctl enable arvados-docker-cleaner.service</span>
-~$ <span class="userinput">sudo systemctl start arvados-docker-cleaner.service</span>
+<pre><code>~$ <span class="userinput">sudo systemctl restart arvados-docker-cleaner</span>
 </code></pre>
 </notextile>
 
-If you are using a different daemon supervisor, or if you want to test the daemon in a terminal window, use the command on the @ExecStart@ line above.
+*If you are using a different daemon supervisor,* or if you want to test the daemon in a terminal window, run @arvados-docker-cleaner@. Run @arvados-docker-cleaner --help@ for more configuration options.
diff --git a/doc/_includes/_notebox_begin_warning.liquid b/doc/_includes/_notebox_begin_warning.liquid
new file mode 100644 (file)
index 0000000..9f97e74
--- /dev/null
@@ -0,0 +1,2 @@
+<div class="alert alert-block alert-warning">
+  <h4>Note:</h4>
index 682511f70c37ac9f2d31960adc8a3d07a712efd5..a2747b0a5916b76c34df8466a9a08069676feb3c 100644 (file)
@@ -1,3 +1,3 @@
-{% include 'notebox_begin' %}
+{% include 'notebox_begin_warning' %}
 Arvados pipeline templates are deprecated.  The recommended way to develop new workflows for Arvados is using the "Common Workflow Language":{{site.baseurl}}/user/cwl/cwl-runner.html.
 {% include 'notebox_end' %}
index ed232c67734f700a6d686352ed26b7e7a314b021..4c4e2542fa86d5ecf6cae8f0757d4195473ef206 100644 (file)
@@ -2,7 +2,7 @@
 <html>
   <head>
     <meta charset="utf-8">
-    <title>{% unless page.title == "Arvados | Documentation" %} Arvados | Documentation | {% endunless %}{{ page.title }}</title>
+    <title>{% unless page.title == "Arvados | Documentation" %} Arvados {% if page.navmenu %}| {{ page.navmenu }} {% endif %} | {% endunless %}{{ page.title }}</title>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta name="description" content="">
     <meta name="author" content="">
diff --git a/doc/api/authentication.html.textile.liquid b/doc/api/authentication.html.textile.liquid
deleted file mode 100644 (file)
index cbf7553..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Concepts
-title: Authentication
-
-...
-
-
-
-Every API request (except the authentication API itself) includes an @access_token@ parameter.
-
-table(table table-bordered table-condensed).
-|Name|Type|Description|
-|access_token|string|Access token returned by OAuth 2.0 authorization procedure|
-
-Many resources contain "actor" attributes like @modified_by@.  An @access_token@ uniquely identifies a client (application or project) and an end-user.
-
-table(table table-bordered table-condensed).
-|Name|Type|Description|
-|modified_by_client_uuid|string|ID of API client|
-|modified_by_user_uuid|string|ID of authenticated user|
-
-h2. Authorizing a client application
-
-The Arvados API uses the "OAuth 2.0 protocol":http://tools.ietf.org/html/draft-ietf-oauth-v2-22 for authentication and authorization.
-
-h3. Register your client application
-
-Before an application can run on an Arvados cloud, it needs to be registered with the cloud. 
-
-That registration yields a @client_id@ and a @client_secret@. 
-
-h3. Obtain an access code
-
-A client obtains an access code by means of a standard Oauth 2.0 flow. The access code is granted to it by an authorized user. The client requests one or more scopes, which translate to a set of requested permissions (reading, writing, etc). Unless the access is to be short-lived, a refresh token is also granted to the application. 
-
-h3. Refresh the access code (optional)
-
-Access codes have a limited lifetime. A refresh token allows an application to request a new access token.
index 98634cdd9ba11ba1f110eaadb8c9554c7b5d847a..4642ed540e0b89cf16f0341de5da12d89e1284f0 100644 (file)
@@ -20,8 +20,8 @@ A task's context is provided in environment variables.
 
 table(table table-bordered table-condensed).
 |Environment variable|Description|
-|@JOB_UUID@|UUID of the current "Job":schema/Job.html|
-|@TASK_UUID@|UUID of the current "JobTask":schema/JobTask.html|
+|@JOB_UUID@|UUID of the current "Job":methods/jobs.html|
+|@TASK_UUID@|UUID of the current "JobTask":methods/job_tasks.html|
 |@ARVADOS_API_HOST@|Hostname and port number of API server|
 |@ARVADOS_API_TOKEN@|Authentication token to use with API calls made by the current task|
 
@@ -43,4 +43,3 @@ task = arvados.api().job_tasks().get(uuid=os.environ['TASK_UUID']).execute()
 $sys.stderr.write("current task sequence number is %d"
                   % task['sequence'])
 </pre>
-
diff --git a/doc/api/execution.html.textile.liquid b/doc/api/execution.html.textile.liquid
new file mode 100644 (file)
index 0000000..973b472
--- /dev/null
@@ -0,0 +1,27 @@
+---
+layout: default
+navsection: api
+title: Computing with Crunch
+...
+
+Crunch is the name for the Arvados system for managing computation.  It provides an abstract API to various clouds and HPC resource allocation and scheduling systems, and integrates closely with Keep storage and the Arvados permission system.
+
+h2. Container API
+
+Note: although the preferred API for Arvados going forward, the Container API may not yet be available on all installations.
+
+# To submit work, create a "container request":{{site.baseurl}}/api/methods/container_requests.html in the @Committed@ state.
+# The system will fufill the container request by creating or reusing a "Container object":{{site.baseurl}}/api/methods/containers.html and assigning it to the @container_uuid@ field.  If the same request has been submitted in the past, it may reuse an existing container.  The reuse behavior can be suppressed with @use_existing: false@ in the container request.
+# The dispatcher process will notice a new container in @Queued@ state and submit a container executor to the underlying work queuing system (such as SLURM).
+# The container executes.  Upon termination the container goes into the  @Complete@ state.  If the container execution was interrupted or lost due to system failure, it will go into the @Cancelled@ state.
+# When the container associated with the container request is completed, the container request will go into the @Final@ state.
+# The @output_uuid@ field of the container request contains the uuid of output collection produced by container request.
+
+!{{site.baseurl}}/images/Crunch_dispatch.svg!
+
+h2. Job API (deprecated)
+
+# To submit work, create a "job":{{site.baseurl}}/api/methods/jobs.html .  If the same job has been submitted in the past, it will return an existing job in @Completed@ state.
+# The dispatcher process will notice a new job in @Queued@ state and attempt to allocate nodes to run the job.
+# The job executes.
+# Retrieve the @output@ field with the portable data hash of the collection with the output files of the job.
index 81b2c1ce6a482418f8302fde597e0ff1bdce300b..d90a35efa40d30ae9abdc17611434c42a1c710a4 100644 (file)
@@ -5,46 +5,12 @@ title: API Reference
 
 ...
 
+This reference describes the semantics of Arvados resources and how to programatically access Arvados via its REST API.  Each resource listed in this section is exposed on the Arvados API server under the @/arvados/v1/@ path prefix, for example, @https://{{ site.arvados_api_host }}/arvados/v1/collections@.
 
+h2. Discovery document
 
-h2. Concepts
+The API server publishes a machine-readable description of its endpoints and some additional site configuration values via a JSON-formatted discovery document.  This is available at @/discovery/v1/apis/arvados/v1/rest@, for example @https://{{ site.arvados_api_host }}/discovery/v1/apis/arvados/v1/rest@.  Some Arvados SDKs use the discovery document to generate language bindings.
 
-* Each API uses the same "authentication mechanism":authentication.html.
-* Resources in requests and responses adhere to a "common structure":resources.html.
-* API transactions use common "REST methods":methods.html.
-* API transactions are subject to a "permission model":permission-model.html.
-* "Job tasks":schema/JobTask.html use some special API features.
+h2. Workbench examples
 
-h2. Resources
-
-h3. Generic Resources
-
-* "Collection":schema/Collection.html
-* "Job":schema/Job.html
-* "JobTask":schema/JobTask.html
-* "Link":schema/Link.html
-* "Log":schema/Log.html
-* "PipelineTemplate":schema/PipelineTemplate.html
-* "PipelineInstance":schema/PipelineInstance.html
-* "Group":schema/Group.html
-* "Human":schema/Human.html
-* "Specimen":schema/Specimen.html
-* "Trait":schema/Trait.html
-* "User":schema/User.html
-
-h3. Authentication
-
-These Arvados resources govern authorization and "authentication":authentication.html:
-
-* "ApiClient":schema/ApiClient.html
-* "ApiClientAuthorization":schema/ApiClientAuthorization.html
-* "AuthorizedKey":schema/AuthorizedKey.html
-
-h3. Arvados Infrastructure
-
-These resources govern the Arvados infrastructure itself: Git repositories, Keep disks, active nodes, etc.
-
-* "KeepDisk":schema/KeepDisk.html
-* "Node":schema/Node.html
-* "Repository":schema/Repository.html
-* "VirtualMachine":schema/VirtualMachine.html
+Many Arvados Workbench pages, under the the *Advanced* tab, provide examples of API and SDK use for accessing the current resource .
index 2d530d147385a5ba529814f53f912c7b1f515126..e731cc7102f37600f450e13691b196f0f2486340 100644 (file)
@@ -2,41 +2,73 @@
 layout: default
 navsection: api
 navmenu: Concepts
-title: REST methods
+title: Common resource methods
 
 ...
 
+The following methods are available for most resources.  Some resources may limit who can perform certain operations.  Consult documentation for individual resource types for details.
 
+The methods are relative to the base URI, e.g. @/arvados/v1/resource_type@.  For arguments specifying a *Location* of @path@, the value of the argument is incorporated into the path portion of the URI.  For example, a @uuid@ of @aaaaa-bbbbb-ccccccccccccccc@ in a path position yields a URI of @/arvados/v1/resource_type/aaaaa-bbbbb-ccccccccccccccc@.
 
-(using Group as an example)
+Arguments specifying a *Location* of @query@ are incorporated into the query portion of the URI or request body.  For example, @/arvados/v1/resource_type?resource_type={}@.
 
-h2(#index). Index, list, search
+h2. create
 
-<pre>
-GET https://{{ site.arvados_api_host }}/arvados/v1/groups?filters=[["owner_uuid","=","xyzzy-tpzed-a4lcehql0dv2u25"]]
+The @create@ method creates a new object of the specified type.  Note that:
 
-POST https://{{ site.arvados_api_host }}/arvados/v1/groups
-_method=GET
-filters=[["owner_uuid","=","xyzzy-tpzed-a4lcehql0dv2u25"]]
-</pre>
+* Only the listed attributes (and "standard metadata":resources.html) are set
+* Unset attributes will get default values
+* The attributes of a given resource type are fixed (you cannot introduce new toplevel attributes)
 
-&rarr; Group resource list
+This method corresponds to the HTTP request @POST /arvados/v1/resource_type@.  A successful create call returns a copy of the new object.
+
+Arguments:
+
+table(table table-bordered table-condensed).
+|_. Argument |_. Type |_. Description |_. Location |
+|{resource_type}|object|Name is the singular form of the resource type, e.g. for the "collections" resource, this argument is "collection"|query||
+
+h2. delete
+
+The @delete@ method deletes an object of the specified type.  It corresponds to the HTTP request @DELETE /arvados/v1/resource_type/uuid@.  A successful delete call returns a copy of the deleted object.
+
+Arguments:
+
+table(table table-bordered table-condensed).
+|_. Argument |_. Type |_. Description |_. Location |
+{background:#ccffcc}.|uuid|string|The UUID of the object in question.|path|
+
+h2. get
+
+The @get@ method gets a single object with the specified @uuid@.  It corresponds to the HTTP request @GET /arvados/v1/resource_type/uuid@.
+
+Arguments:
+
+table(table table-bordered table-condensed).
+|_. Argument |_. Type |_. Description |_. Location |
+{background:#ccffcc}.|uuid|string|The UUID of the object in question.|path|
+
+h2(#index). list
+
+The @list@ method requests an list of resources of that type.  It corresponds to the HTTP request @GET /arvados/v1/resource_type@.  All resources support "list" method unless otherwise noted.
+
+Arguments:
 
 table(table table-bordered table-condensed).
-|*Parameter name*|*Value*|*Description*|
-|limit   |integer|Maximum number of resources to return.|
-|offset  |integer|Skip the first 'offset' resources that match the given filter conditions.|
-|filters |array  |Conditions for selecting resources to return (see below).|
+|_. Argument |_. Type |_. Description |_. Location |
+|limit   |integer|Maximum number of resources to return.  If not provided, server will provide a default limit.  Server may also impose a maximum number of records that can be returned in a single request.|query|
+|offset  |integer|Skip the first 'offset' number of resources that would be returned under the given filter conditions.|query|
+|filters |array  |"Conditions for selecting resources to return.":#filters|query|
 |order   |array  |Attributes to use as sort keys to determine the order resources are returned, each optionally followed by @asc@ or @desc@ to indicate ascending or descending order.
 Example: @["head_uuid asc","modified_at desc"]@
-Default: @["created_at desc"]@|
+Default: @["created_at desc"]@|query|
 |select  |array  |Set of attributes to include in the response.
 Example: @["head_uuid","tail_uuid"]@
-Default: all available attributes, minus "manifest_text" in the case of collections.|
+Default: all available attributes.  As a special case, collections do not return "manifest_text" unless explicitly selected.|query|
 |distinct|boolean|@true@: (default) do not return duplicate objects
-@false@: permitted to return duplicates|
+@false@: permitted to return duplicates|query|
 
-h3. Filters
+h3(#filters). Available list method filters
 
 The value of the @filters@ parameter is an array of conditions. The @list@ method returns only the resources that satisfy all of the given conditions. In other words, the conjunction @AND@ is implicit.
 
@@ -58,45 +90,23 @@ table(table table-bordered table-condensed).
 |@in@, @not in@|array of strings|@["script_version","in",["master","d00220fb38d4b85ca8fc28a8151702a2b9d1dec5"]]@|
 |@is_a@|string|@["head_uuid","is_a","arvados#pipelineInstance"]@|
 
-h2. Create
-
-<pre>
-POST https://{{ site.arvados_api_host }}/arvados/v1/groups
-group={"name":"fresh new group"}
-</pre>
-
-&rarr; Group resource
-
-h2. Delete
-
-<pre>
-DELETE https://{{ site.arvados_api_host }}/arvados/v1/groups/xyzzy-ldvyl-vyydjeplwaa6emg
-</pre>
+h3. Results of list method
 
-&rarr; Group resource
+A successful call to list will return the following object.
 
-h2. Update
-
-<pre>
-PUT https://{{ site.arvados_api_host }}/arvados/v1/groups/xyzzy-ldvyl-vyydjeplwaa6emg
-group={"uuid":"xyzzy-ldvyl-vyydjeplwaa6emg", "name":"Important group"}
-</pre>
-
-&rarr; Group resource
-
-<pre>
-PUT https://{{ site.arvados_api_host }}/arvados/v1/groups/xyzzy-ldvyl-vyydjeplwaa6emg
-group[uuid]=xyzzy-ldvyl-vyydjeplwaa6emg
-group[name]=Important group
-</pre>
-
-&rarr; Group resource
+table(table table-bordered table-condensed).
+|_. Attribute |_. Type |_. Description |
+|kind|string|type of objects returned|
+|offset|integer|query offset in effect|
+|limit|integer|query limit in effect|
+|items|array|actual query payload, an array of resource objects|
+|items_available|integer|total items available matching query|
 
-More appropriate (but not yet implemented):
+h2. update
 
-<pre>
-PATCH https://{{ site.arvados_api_host }}/arvados/v1/groups/xyzzy-ldvyl-vyydjeplwaa6emg
-group={"uuid":"xyzzy-ldvyl-vyydjeplwaa6emg", "name":"Important group"}
-</pre>
+The @update@ method updates fields on the object with the specified @uuid@.  It corresponds to the HTTP request @PUT /arvados/v1/resource_type/uuid@.  Note that only the listed attributes (and "standard metadata":resources.html) are updated, unset attributes will retain their previous values, and the attributes of a given resource type are fixed (you cannot introduce new toplevel attributes).  Also note that updates replace the value of the attribute, so if an attribute has an object value, the entire object is replaced.  A successful update call returns the updated copy of the object.
 
-&rarr; Group resource
+table(table table-bordered table-condensed).
+|_. Argument |_. Type |_. Description |_. Location |
+{background:#ccffcc}.|uuid|string|The UUID of the resource in question.|path||
+|{resource_type}|object||query||
index 7af9711b9d17e95d3a524c6e895446f8b8f17058..ab49610ab168332a78f3fdc9f69066105c4bf3b4 100644 (file)
@@ -6,24 +6,50 @@ title: "api_client_authorizations"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/api_client_authorizations@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @gj3su@
+
+Example UUID: @zzzzz-gj3su-0123456789abcde@
+
+h2. Resource
+
+The @api_client_authorizations@ resource stores the API tokens that have been issued to permit access the API server.
+
+An ApiClientAuthorization is *not* a generic Arvados resource.  The full list of properties that belong to an ApiClientAuthorization is:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|uuid|string|An identifier used to refer to the token without exposing the actual token.||
+|api_token|string|The actual token string that is expected in the Authorization header.||
+|api_client_id|integer|-||
+|user_id|integer|-||
+|created_by_ip_address|string|-||
+|last_used_by_ip_address|string|The network address of the most recent client using this token.||
+|last_used_at|datetime|Timestamp of the most recent request using this token.||
+|expires_at|datetime|Time at which the token is no longer valid.  May be set to a time in the past in order to immediately expire a token.||
+|owner_uuid|string|The user associated with the token.  All operations using this token are checked against the permissions of this user.||
+|scopes|array|A list of resources this token is allowed to access.  A scope of ["all"] allows all resources.  See "API Authorization":{{site.baseurl}}/api/tokens.html#scopes for details.||
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
 
+Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3(#create). create
 
 Create a new ApiClientAuthorization.
 
+Regular users may only create self-owned API tokens, but may provide a restricted "scope":{{site.baseurl}}/api/tokens.html#scopes .  Administrators may create API tokens corresponding to any user.
+
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |api_client_authorization|object||query||
 
-h2. create_system_auth
+h3. create_system_auth
 
 create_system_auth api_client_authorizations
 
@@ -34,7 +60,7 @@ table(table table-bordered table-condensed).
 |api_client_id|integer||query||
 |scopes|array||query||
 
-h2. delete
+h3. delete
 
 Delete an existing ApiClientAuthorization.
 
@@ -44,9 +70,9 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the ApiClientAuthorization in question.|path||
 
-h2. get
+h3. get
 
-Gets a ApiClientAuthorization's metadata by UUID.
+Gets an ApiClientAuthorization's metadata by UUID.
 
 Arguments:
 
@@ -54,19 +80,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the ApiClientAuthorization in question.|path||
 
-h2. list
+h3. list
 
 List api_client_authorizations.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of api_client_authorizations to return.|query||
-|order|string|Order in which to return matching api_client_authorizations.|query||
-|filters|array|Conditions for filtering api_client_authorizations.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing ApiClientAuthorization.
 
index 056cc30812c767ea06b8ec53310dc1c8bc362fa0..f0224fbc4813a6367967d5328b4eb19d34cb31cd 100644 (file)
@@ -6,13 +6,31 @@ title: "api_clients"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/api_clients@
 
+Object type: @ozdt8@
+
+Example UUID: @zzzzz-ozdt8-0123456789abcde@
+
+h2. Resource
+
+The "api_clients" resource determines if web applications that have gone through the browser login flow may create or list API tokens.
+
+Each ApiClient has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|||
+|url_prefix|string|||
+|is_trusted|boolean|Trusted by users to handle their API tokens (ApiClientAuthorizations).||
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new ApiClient.
 
@@ -22,7 +40,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |api_client|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing ApiClient.
 
@@ -32,7 +50,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the ApiClient in question.|path||
 
-h2. get
+h3. get
 
 Gets a ApiClient's metadata by UUID.
 
@@ -42,19 +60,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the ApiClient in question.|path||
 
-h2. list
+h3. list
 
 List api_clients.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of api_clients to return.|query||
-|order|string|Order in which to return matching api_clients.|query||
-|filters|array|Conditions for filtering api_clients.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing ApiClient.
 
index 9727c5730c54375917e0f36ce800ae93bdfd72cf..2912ba83d136193018e909e240dec91fb3d7fa04 100644 (file)
@@ -6,14 +6,33 @@ title: "authorized_keys"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/authorized_keys@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @fngyi@
+
+Example UUID: @zzzzz-fngyi-0123456789abcde@
+
+h2. Resource
+
+The authorized_keys resource stores SSH public keys which grant access to virtual machines or git repositories on the Arvados cluster as the user in @authorized_user_uuid@.
+
+Each AuthorizedKey has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|A name to help the user manage their keys.||
+|key_type|string|Public key type, currently only supports "SSH"||
+|authorized_user_uuid|string|The user to which this key belongs.  Authentication using this key authenticates as this user.||
+|public_key|text|The actual public key material, e.g. from @~/.ssh/id_rsa.pub@||
+|expires_at|datetime|Expiration date after which the key is no longer valid.||
 
+h2. Methods
 
-h2. create
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new AuthorizedKey.
 
@@ -23,7 +42,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |authorized_key|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing AuthorizedKey.
 
@@ -33,7 +52,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the AuthorizedKey in question.|path||
 
-h2. get
+h3. get
 
 Gets a AuthorizedKey's metadata by UUID.
 
@@ -43,19 +62,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the AuthorizedKey in question.|path||
 
-h2. list
+h3. list
 
 List authorized_keys.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of authorized_keys to return.|query||
-|order|string|Order in which to return matching authorized_keys.|query||
-|filters|array|Conditions for filtering authorized_keys.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing AuthorizedKey.
 
index f5e685e2e9be44a1d740defff0a1ffb0e60da80f..808125a9e676972d70aa9a75017951cf708b0063 100644 (file)
@@ -6,13 +6,45 @@ title: "collections"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/collections@
 
+Object type: @4zz18@
+
+Example UUID: @zzzzz-4zz18-0123456789abcde@
+
+h2. Resource
+
+Collections describe sets of files in terms of data blocks stored in Keep.  See "storage in Keep":{{site.baseurl}}/api/storage.html for details.
+
+Each collection has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|||
+|description|text|||
+|portable_data_hash|string|The MD5 sum of the manifest text stripped of block hints other than the size hint.||
+|manifest_text|text|||
+|replication_desired|number|Minimum storage replication level desired for each data block referenced by this collection. A value of @null@ signifies that the site default replication level (typically 2) is desired.|@2@|
+|replication_confirmed|number|Replication level most recently confirmed by the storage system. This field is null when a collection is first created, and is reset to null when the manifest_text changes in a way that introduces a new data block. An integer value indicates the replication level of the _least replicated_ data block in the collection.|@2@, null|
+|replication_confirmed_at|datetime|When replication_confirmed was confirmed. If replication_confirmed is null, this field is also null.||
+
+h3. Conditions of creating a Collection
+
+The @portable_data_hash@ and @manifest_text@ attributes must be provided when creating a Collection. The cryptographic digest of the supplied @manifest_text@ must match the supplied @portable_data_hash@.
+
+h3. Side effects of creating a Collection
+
+Referenced blocks are protected from garbage collection in Keep.
+
+Data can be shared with other users via the Arvados permission model.
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new Collection.
 
@@ -22,7 +54,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |collection|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Collection.
 
@@ -32,7 +64,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Collection in question.|path||
 
-h2. get
+h3. get
 
 Gets a Collection's metadata by UUID.
 
@@ -42,22 +74,15 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Collection in question.|path||
 
-h2. list
+h3. list
 
 List collections.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of collections to return.|query||
-|order|string|Order in which to return matching collections.|query||
-|filters|array|Conditions for filtering collections.|query||
-|select|array|Data fields to return in the result list.|query|@["uuid", "manifest_text"]@|
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
 Note: Because adding access tokens to manifests can be computationally expensive, the @manifest_text@ field is not included in results by default.  If you need it, pass a @select@ parameter that includes @manifest_text@.
 
-h2. update
+h3. update
 
 Update attributes of an existing Collection.
 
index 2603079560e8a857c60c1e16c20b43b1476c46fe..304226d5de59af541906b975b2b4cd2313e2290e 100644 (file)
@@ -6,70 +6,124 @@ title: "container_requests"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/container_requests@
 
+Object type: @xvhdp@
+
+Example UUID: @zzzzz-xvhdp-0123456789abcde@
+
+h2. Resource
+
+A container request is a request for the Arvados cluster to perform some computational work.  See "computing with Crunch":{{site.baseurl}}/api/execution.html for details.
+
+Each ContainerRequest offers the following attributes, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+All attributes are optional, unless otherwise marked as required.
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Notes|
+|name|string|The name of the container_request.||
+|description|string|The description of the container_request.||
+|properties|hash|Client-defined structured data that does not affect how the container is run.||
+|state|string|The allowed states are "Uncommitted", "Committed", and "Final".|Once a request is Committed, the only attributes that can be modified are priority, container_uuid, and container_count_max. A request in the "Final" state cannot have any of its functional parts modified (i.e., only name, description, and properties fields can be modified).|
+|requesting_container_uuid|string|The uuid of the parent container that created this container_request, if any. Represents a process tree.|The priority of this container_request is inherited from the parent container, if the parent container is cancelled, this container_request will be cancelled as well.|
+|container_uuid|string|The uuid of the container that satisfies this container_request. The system may return a preexisting Container that matches the container request criteria. See "Container reuse":#container_reuse for more details.|Container reuse is the default behavior, but may be disabled with @use_existing: false@ to always create a new container.|
+|container_count_max|integer|Maximum number of containers to start, i.e., the maximum number of "attempts" to be made.||
+|mounts|hash|Objects to attach to the container's filesystem and stdin/stdout.|See "Mount types":#mount_types for more details.|
+|runtime_constraints|hash|Restrict the container's access to compute resources and the outside world.|Required when in "Committed" state. e.g.,<pre><code>{
+  "ram":12000000000,
+  "vcpus":2,
+  "API":true
+}</code></pre>See "Runtime constraints":#runtime_constraints for more details.|
+|container_image|string|Portable data hash of a collection containing the docker image to run the container.|Required.|
+|environment|hash|Environment variables and values that should be set in the container environment (@docker run --env@). This augments and (when conflicts exist) overrides environment variables given in the image's Dockerfile.||
+|cwd|string|Initial working directory, given as an absolute path (in the container) or a path relative to the WORKDIR given in the image's Dockerfile.|Required.|
+|command|array of strings|Command to execute in the container.|Required. e.g., @["echo","hello"]@|
+|output_path|string|Path to a directory or file inside the container that should be preserved as container's output when it finishes. This path must be, or be inside, one of the mount targets. For best performance, point output_path to a writable collection mount.|Required.|
+|priority|integer|Higher value means spend more resources on this container_request, i.e., go ahead of other queued containers, bring up more nodes etc.|Priority 0 means a container should not be run on behalf of this request. Clients are expected to submit container requests with zero priority in order to prevew the container that will be used to satisfy it. Priority can be null if and only if state!="Committed".|
+|expires_at|datetime|After this time, priority is considered to be zero.|Not yet implemented.|
+|use_existing|boolean|If possible, use an existing (non-failed) container to satisfy the request instead of creating a new one.|Default is true|
+|filters|string|Additional constraints for satisfying the container_request, given in the same form as the filters parameter accepted by the container_requests.list API.|
+
+h2(#mount_types). {% include 'mount_types' %}
+
+h2(#runtime_constraints). {% include 'container_runtime_constraints' %}
+
+h2(#container_reuse). Container reuse
+
+When a container request is "Committed", the system will try to find and reuse any preexisting Container with the same exact command, cwd, environment, output_path, container_image, mounts, and runtime_constraints as this container request. The serialized fields environment, mounts and runtime_constraints are sorted to facilitate comparison.
+
+The system will use the following scheme to determine which Container to consider for reuse: A Container with the same exact command, cwd, environment, output_path, container_image, mounts, and runtime_constraints as this container request and,
+* The oldest successfully finished container, i.e., in state "Complete" with exit_code of 0. If matching containers with different outputs are found, the system will forgo reusing any of these finished containers and instead look for suitable containers in other states
+* The oldest "Running" container with the highest progress, i.e., the container that is most likely to finish first
+* The oldest "Locked" container with the highest priority, i.e., the container that is most likely to start first
+* The oldest "Queued" container with the highest priority, i.e, the container that is most likely to start first
+
+h2(#cancel_container). Canceling a container request
+
+A container request may be canceled by setting it's priority to 0, using an update call.
+
+When a container request is canceled, it will still reflect the state of the Container it is associated with via the container_uuid attribute. If that Container is being reused by any other container_requests that are still active, i.e., not yet canceled, that Container may continue to run or be scheduled to run by the system in future. However, if no other container_requests are using that Contianer, then the Container will get canceled as well.
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
 h2(#create). create
 
-Create a new ContainerRequest.
+Create a new container request.
 
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|container_request|object|See "ContainerRequest resource":{{site.baseurl}}/api/schema/ContainerRequest.html|request body||
+{background:#ccffcc}.|container_request|object|Container request resource.|request body||
+
 
 The request body must include the required attributes command, container_image, cwd, and output_path. It can also inlcude other attributes such as environment, mounts, and runtime_constraints.
 
-h2. delete
+h3. delete
 
-Delete an existing ContainerRequest.
+Delete an existing container request.
 
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|uuid|string|The UUID of the ContainerRequest in question.|path||
+{background:#ccffcc}.|uuid|string|The UUID of the container request in question.|path||
 
-h2. get
+h3. get
 
-Get a ContainerRequest's metadata by UUID.
+Get a container request's metadata by UUID.
 
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|uuid|string|The UUID of the ContainerRequest in question.|path||
+{background:#ccffcc}.|uuid|string|The UUID of the container request in question.|path||
 
-h2. list
+h3. list
 
 List container_requests.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of container_requests to return.|query||
-|order|string|Order in which to return matching container_requests.|query||
-|filters|array|Conditions for filtering container_requests.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-See the create method documentation for more information about ContainerRequest-specific filters.
+See the create method documentation for more information about container request-specific filters.
 
-h2. update
+h3. update
 
-Update attributes of an existing ContainerRequest.
+Update attributes of an existing container request.
 
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|uuid|string|The UUID of the ContainerRequest in question.|path||
+{background:#ccffcc}.|uuid|string|The UUID of the container request in question.|path||
 |container_request|object||query||
 
 {% include 'notebox_begin' %}
 Setting the priority of a committed container_request to 0 may cancel a running container assigned for it.
-See "Canceling a ContainerRequest":{{site.baseurl}}/api/schema/ContainerRequest.html#cancel_container for further details.
+See "Canceling a container request":{{site.baseurl}}/api/methods/container_requests.html#cancel_container for further details.
 {% include 'notebox_end' %}
index c39b0926c18b717f0c09b1cf4355e2f8d89ed67d..221141cebc82537631b2c6b7fd53d18f3af36afa 100644 (file)
@@ -6,10 +6,62 @@ title: "containers"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/containers@
 
+Object type: @dz642@
+
+Example UUID: @zzzzz-dz642-0123456789abcde@
+
+h2. Resource
+
+A container is work order to be dispatched to an Arvados cluster to perform some computational work.  A container is created in response to a container request.  See "computing with Crunch":{{site.baseurl}}/api/execution.html for details.
+
+Each Container offers the following attributes, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Notes|
+|state|string|The allowed states are "Queued", "Locked", "Running", "Cancelled" and "Complete".|See "Container states":#container_states for more details.|
+|started_at|datetime|When this container started running.|Null if container has not yet started.|
+|finished_at|datetime|When this container finished.|Null if container has not yet finished.|
+|log|string|Portable data hash of the collection containing logs from a completed container run.|Null if the container is not yet finished.|
+|environment|hash|Environment variables and values that should be set in the container environment (@docker run --env@). This augments and (when conflicts exist) overrides environment variables given in the image's Dockerfile.|Must be equal to a ContainerRequest's environment in order to satisfy the ContainerRequest.|
+|cwd|string|Initial working directory.|Must be equal to a ContainerRequest's cwd in order to satisfy the ContainerRequest|
+|command|array of strings|Command to execute.| Must be equal to a ContainerRequest's command in order to satisfy the ContainerRequest.|
+|output_path|string|Path to a directory or file inside the container that should be preserved as this container's output when it finishes.|Must be equal to a ContainerRequest's output_path in order to satisfy the ContainerRequest.|
+|mounts|hash|Must contain the same keys as the ContainerRequest being satisfied. Each value must be within the range of values described in the ContainerRequest at the time the Container is assigned to the ContainerRequest.|See "Mount types":#mount_types for more details.|
+|runtime_constraints|hash|Compute resources, and access to the outside world, that are / were available to the container.
+Generally this will contain additional keys that are not present in any corresponding ContainerRequests: for example, even if no ContainerRequests specified constraints on the number of CPU cores, the number of cores actually used will be recorded here.|e.g.,
+<pre><code>{
+  "ram":12000000000,
+  "vcpus":2,
+  "API":true
+}</code></pre>See "Runtime constraints":#runtime_constraints for more details.|
+|output|string|Portable data hash of the output collection.|Null if the container is not yet finished.|
+|container_image|string|Portable data hash of a collection containing the docker image used to run the container.||
+|progress|number|A number between 0.0 and 1.0 describing the fraction of work done.||
+|priority|integer|Priority assigned by the system, taking into account the priorities of all associated ContainerRequests.||
+|exit_code|integer|Process exit code.|Null if state!="Complete"|
+|auth_uuid|string|UUID of a token to be passed into the container itself, used to access Keep-backed mounts, etc.|Null if state∉{"Locked","Running"}|
+|locked_by_uuid|string|UUID of a token, indicating which dispatch process changed state to Locked. If null, any token can be used to lock. If not null, only the indicated token can modify this container.|Null if state∉{"Locked","Running"}|
+
+h2(#container_states). Container states
+
+table(table table-bordered table-condensed).
+|_. State|_. Sgnificance|_. Allowed next|
+|Queued|Waiting for a dispatcher to lock it and try to run the container.|Locked, Cancelled|
+|Locked|A dispatcher has "taken" the container and is allocating resources for it. The container has not started yet.|Queued, Running, Cancelled|
+|Running|Resources have been allocated and the contained process has been started (or is about to start). Crunch-run _must_ set state to Running _before_ there is any possibility that user code will run in the container.|Complete, Cancelled|
+|Complete|Container was running, and the contained process/command has exited.|-|
+|Cancelled|The container did not run long enough to produce an exit code. This includes cases where the container didn't even start, cases where the container was interrupted/killed before it exited by itself (e.g., priority changed to 0), and cases where some problem prevented the system from capturing the contained process's exit status (exit code and output).|-|
+
+h2(#mount_types). {% include 'mount_types' %}
+
+h2(#runtime_constraints). {% include 'container_runtime_constraints' %}
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
 h2(#create). create
@@ -20,9 +72,9 @@ Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|container|object|See "Container resource":{{site.baseurl}}/api/schema/Container.html|request body||
+{background:#ccffcc}.|container|object|Container resource|request body||
 
-h2. delete
+h3. delete
 
 Delete an existing Container.
 
@@ -32,7 +84,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Container in question.|path||
 
-h2. get
+h3. get
 
 Get a Container's metadata by UUID.
 
@@ -42,21 +94,15 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Container in question.|path||
 
-h2. list
+h3. list
 
 List containers.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of containers to return.|query||
-|order|string|Order in which to return matching containers.|query||
-|filters|array|Conditions for filtering containers.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
 See the create method documentation for more information about Container-specific filters.
 
-h2. update
+h3. update
 
 Update attributes of an existing Container.
 
@@ -67,7 +113,7 @@ table(table table-bordered table-condensed).
 {background:#ccffcc}.|uuid|string|The UUID of the Container in question.|path||
 |container|object||query||
 
-h2. auth
+h3. auth
 
 Get the api_client_authorization record indicated by this container's auth_uuid, which belongs to the container's locked_by_uuid.
 
index cd9633db427aa1807d4a600f6533225f543e4b34..7a15d20d5aaf3d5b1ff63aedf9f958d6e91efc3e 100644 (file)
@@ -3,18 +3,35 @@ layout: default
 navsection: api
 navmenu: API Methods
 title: "groups"
-
 ...
 
+API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/groups@
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
+Object type: @j7d0g@
 
-API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/groups@
+Example UUID: @zzzzz-j7d0g-0123456789abcde@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+h2. Resource
+
+Groups provides a way to apply the same permissions to a set of Arvados objects.  See "permission model":{{site.baseurl}}/api/permission-model.html for details.
+
+Each Group has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|||
+|group_class|string|Type of group. This does not affect behavior, but determines how the group is presented in the user interface. For example, @project@ indicates that the group should be displayed by Workbench and arv-mount as a project for organizing and naming objects.|@"project"@
+null|
+|description|text|||
+|writable_by|array|List of UUID strings identifying Users and other Groups that have write permission for this Group.  Only users who are allowed to administer the Group will receive a full list.  Other users will receive a partial list that includes the Group's owner_uuid and (if applicable) their own user UUID.||
 
+h2. Methods
 
-h2. contents
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. contents
 
 Retrieve a list of items owned by the group.
 
@@ -31,7 +48,7 @@ Note: Because adding access tokens to manifests can be computationally expensive
 
 Note: Use filters with the attribute format @<item type>.<field name>@ to filter items of a specific type. For example: @["pipeline_instances.state", "=", "Complete"]@ to filter @pipeline_instances@ where @state@ is @Complete@. All other types of items owned by this group will be unimpacted by this filter and will still be included.
 
-h2. create
+h3. create
 
 Create a new Group.
 
@@ -41,7 +58,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |group|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Group.
 
@@ -51,7 +68,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Group in question.|path||
 
-h2. get
+h3. get
 
 Gets a Group's metadata by UUID.
 
@@ -61,19 +78,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Group in question.|path||
 
-h2. list
+h3. list
 
 List groups.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of groups to return.|query||
-|order|string|Order in which to return matching groups.|query||
-|filters|array|Conditions for filtering groups.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. show
+h3. show
 
 show groups
 
@@ -83,7 +94,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string||path||
 
-h2. update
+h3. update
 
 Update attributes of an existing Group.
 
index 1d8c13e9dc41fe86c5f93f3dba78264f82e123c2..c4f2fd6215106aefd07d359c3bbebe7c3e709fdc 100644 (file)
@@ -6,14 +6,29 @@ title: "humans"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/humans@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @7a9it@
+
+Example UUID: @zzzzz-7a9it-0123456789abcde@
+
+h2. Resource
+
+A metadata record that may be used to represent a human subject.
+
+Each Human has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|properties|hash|||
 
+h2. Methods
 
-h2. create
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new Human.
 
@@ -23,7 +38,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |human|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Human.
 
@@ -33,7 +48,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Human in question.|path||
 
-h2. get
+h3. get
 
 Gets a Human's metadata by UUID.
 
@@ -43,19 +58,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Human in question.|path||
 
-h2. list
+h3. list
 
 List humans.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of humans to return.|query||
-|order|string|Order in which to return matching humans.|query||
-|filters|array|Conditions for filtering humans.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing Human.
 
index 7b040d85b3c0b41841d50f99108257df72bcde62..4969abf9efab0eb35739c2c779060f5e27d63f7c 100644 (file)
@@ -6,14 +6,45 @@ title: "job_tasks"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/job_tasks@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @ot0gb@
+
+Example UUID: @zzzzz-ot0gb-0123456789abcde@
+
+h2. Resource
+
+Deprecated.
 
+A job task is a individually scheduled unit of work executed as part of an overall job.
 
-h2. create
+Each JobTask has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|sequence|integer|Execution sequence.
+A step cannot be run until all steps with lower sequence numbers have completed.
+Job steps with the same sequence number can be run in any order.||
+|parameters|hash|||
+|output|text|||
+|progress|float|||
+|success|boolean|Is null if the task has neither completed successfully nor failed permanently.||
+
+The following attributes should not be updated by anyone other than the job manager:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Notes|
+|qsequence|integer|Order of arrival|0-based|
+|job_uuid|string|||
+|created_by_job_task_uuid|string|||
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new JobTask.
 
@@ -23,7 +54,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |job_task|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing JobTask.
 
@@ -33,7 +64,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the JobTask in question.|path||
 
-h2. get
+h3. get
 
 Gets a JobTask's metadata by UUID.
 
@@ -43,19 +74,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the JobTask in question.|path||
 
-h2. list
+h3. list
 
 List job_tasks.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of job_tasks to return.|query||
-|order|string|Order in which to return matching job_tasks.|query||
-|filters|array|Conditions for filtering job_tasks.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing JobTask.
 
index 90a3c4c72216136909ca6fe1f5c074d5298b440f..01776ab17895f005f28e0f849eec15cf96545151 100644 (file)
@@ -6,13 +6,76 @@ title: "jobs"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/jobs@
 
+Object type: @8i9sb@
+
+Example UUID: @zzzzz-8i9sb-0123456789abcde@
+
+h2. Resource
+
+Deprecated.
+
+A job describes a work order to be executed by the Arvados cluster.
+
+Each job has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Notes|
+|script|string|The filename of the job script.|This program will be invoked by Crunch for each job task. It is given as a path to an executable file, relative to the @/crunch_scripts@ directory in the Git tree specified by the _repository_ and _script_version_ attributes.|
+|script_parameters|hash|The input parameters for the job.|Conventionally, one of the parameters is called @"input"@. Typically, some parameter values are collection UUIDs. Ultimately, though, the significance of parameters is left entirely up to the script itself.|
+|repository|string|Git repository name or URL.|Source of the repository where the given script_version is to be found. This can be given as the name of a locally hosted repository, or as a publicly accessible URL starting with @git://@, @http://@, or @https://@.
+Examples:
+@yourusername/yourrepo@
+@https://github.com/curoverse/arvados.git@|
+|script_version|string|Git commit|During a **create** transaction, this is the Git branch, tag, or hash supplied by the client. Before the job starts, Arvados updates it to the full 40-character SHA-1 hash of the commit used by the job.
+See "Specifying Git versions":#script_version below for more detail about acceptable ways to specify a commit.|
+|cancelled_by_client_uuid|string|API client ID|Is null if job has not been cancelled|
+|cancelled_by_user_uuid|string|Authenticated user ID|Is null if job has not been cancelled|
+|cancelled_at|datetime|When job was cancelled|Is null if job has not been cancelled|
+|started_at|datetime|When job started running|Is null if job has not [yet] started|
+|finished_at|datetime|When job finished running|Is null if job has not [yet] finished|
+|running|boolean|Whether the job is running||
+|success|boolean|Whether the job indicated successful completion|Is null if job has not finished|
+|is_locked_by_uuid|string|UUID of the user who has locked this job|Is null if job is not locked. The system user locks the job when starting the job, in order to prevent job attributes from being altered.|
+|node_uuids|array|List of UUID strings for node objects that have been assigned to this job||
+|log|string|Collection UUID|Is null if the job has not finished. After the job runs, the given collection contains a text file with log messages provided by the @arv-crunch-job@ task scheduler as well as the standard error streams provided by the task processes.|
+|tasks_summary|hash|Summary of task completion states.|Example: @{"done":0,"running":4,"todo":2,"failed":0}@|
+|output|string|Collection UUID|Is null if the job has not finished.|
+|nondeterministic|boolean|The job is expected to produce different results if run more than once.|If true, this job will not be considered as a candidate for automatic re-use when submitting subsequent identical jobs.|
+|submit_id|string|Unique ID provided by client when job was submitted|Optional. This can be used by a client to make the "jobs.create":{{site.baseurl}}/api/methods/jobs.html#create method idempotent.|
+|priority|string|||
+|arvados_sdk_version|string|Git commit hash that specifies the SDK version to use from the Arvados repository|This is set by searching the Arvados repository for a match for the arvados_sdk_version runtime constraint.|
+|docker_image_locator|string|Portable data hash of the collection that contains the Docker image to use|This is set by searching readable collections for a match for the docker_image runtime constraint.|
+|runtime_constraints|hash|Constraints that must be satisfied by the job/task scheduler in order to run the job.|See below.|
+|components|hash|Name and uuid pairs representing the child work units of this job. The uuids can be of different object types.|Example components hash: @{"name1": "zzzzz-8i9sb-xyz...", "name2": "zzzzz-d1hrv-xyz...",}@|
+
+h3(#script_version). Specifying Git versions
+
+The script_version attribute and arvados_sdk_version runtime constraint are typically given as a branch, tag, or commit hash, but there are many more ways to specify a Git commit. The "specifying revisions" section of the "gitrevisions manual page":http://git-scm.com/docs/gitrevisions.html has a definitive list. Arvados accepts Git versions in any format listed there that names a single commit (not a tree, a blob, or a range of commits). However, some kinds of names can be expected to resolve differently in Arvados than they do in your local repository. For example, <code>HEAD@{1}</code> refers to the local reflog, and @origin/master@ typically refers to a remote branch: neither is likely to work as desired if given as a Git version.
+
+h3. Runtime constraints
+
+table(table table-bordered table-condensed).
+|_. Key|_. Type|_. Description|_. Implemented|
+|arvados_sdk_version|string|The Git version of the SDKs to use from the Arvados git repository.  See "Specifying Git versions":#script_version for more detail about acceptable ways to specify a commit.  If you use this, you must also specify a @docker_image@ constraint (see below).  In order to install the Python SDK successfully, Crunch must be able to find and run virtualenv inside the container.|&#10003;|
+|docker_image|string|The Docker image that this Job needs to run.  If specified, Crunch will create a Docker container from this image, and run the Job's script inside that.  The Keep mount and work directories will be available as volumes inside this container.  The image must be uploaded to Arvados using @arv keep docker@.  You may specify the image in any format that Docker accepts, such as @arvados/jobs@, @debian:latest@, or the Docker image id.  Alternatively, you may specify the portable data hash of the image Collection.|&#10003;|
+|min_nodes|integer||&#10003;|
+|max_nodes|integer|||
+|min_cores_per_node|integer|Require that each node assigned to this Job have the specified number of CPU cores|&#10003;|
+|min_ram_mb_per_node|integer|Require that each node assigned to this Job have the specified amount of real memory (in MiB)|&#10003;|
+|min_scratch_mb_per_node|integer|Require that each node assigned to this Job have the specified amount of scratch storage available (in MiB)|&#10003;|
+|max_tasks_per_node|integer|Maximum simultaneous tasks on a single node|&#10003;|
+|keep_cache_mb_per_task|integer|Size of file data buffer for per-task Keep directory ($TASK_KEEPMOUNT), in MiB.  Default is 256 MiB.  Increase this to reduce cache thrashing in situtations such as accessing multiple large (64+ MiB) files at the same time, or accessing different parts of a large file at the same time.|&#10003;|
+|min_ram_per_task|integer|Minimum real memory (KiB) per task||
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. cancel
+h3. cancel
 
 Cancel a job that is queued or running.
 
@@ -22,7 +85,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string||path||
 
-h2(#create). create
+h3(#create). create
 
 Create a new Job.
 
@@ -30,7 +93,7 @@ Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|job|object|See "Job resource":{{site.baseurl}}/api/schema/Job.html|request body||
+{background:#ccffcc}.|job|object|Job resource|request body||
 |minimum_script_version |string     |Git branch, tag, or commit hash specifying the minimum acceptable script version (earliest ancestor) to consider when deciding whether to re-use a past job.[1]|query|@"c3e86c9"@|
 |exclude_script_versions|array of strings|Git commit branches, tags, or hashes to exclude when deciding whether to re-use a past job.|query|@["8f03c71","8f03c71"]@
 @["badtag1","badtag2"]@|
@@ -39,9 +102,9 @@ table(table table-bordered table-condensed).
 
 When a job is submitted to the queue using the **create** method, the @script_version@ attribute is updated to a full 40-character Git commit hash based on the current content of the specified repository. If @script_version@ cannot be resolved, the job submission is rejected.
 
-fn1. See the "note about specifying Git commits on the Job resource page":{{site.baseurl}}/api/schema/Job.html#script_version for more detail.
+fn1. See the "note about specifying Git commits":#script_version for more detail.
 
-h3. Specialized filters
+h4. Specialized filters
 
 Special filter operations are available for specific Job columns.
 
@@ -53,7 +116,7 @@ Special filter operations are available for specific Job columns.
 
 * @docker_image_locator@ @not in docker@ @SEARCH@<br>Negate the @in docker@ filter.
 
-h3. Reusing jobs
+h4. Reusing jobs
 
 Because Arvados records the exact version of the script, input parameters, and runtime environment that was used to run the job, if the script is deterministic (meaning that the same code version is guaranteed to produce the same outputs from the same inputs) then it is possible to re-use the results of past jobs, and avoid re-running the computation to save time.  Arvados uses the following algorithm to determine if a past job can be re-used:
 
@@ -68,7 +131,7 @@ notextile. <div class="spaced-out">
 
 </div>
 
-h3. Examples
+h4. Examples
 
 Run the script "crunch_scripts/hash.py" in the repository "you" using the "master" commit.  Arvados should re-use a previous job if the script_version of the previous job is the same as the current "master" commit. This works irrespective of whether the previous job was submitted using the name "master", a different branch name or tag indicating the same commit, a SHA-1 commit hash, etc.
 
@@ -156,7 +219,7 @@ Run the script "crunch_scripts/monte-carlo.py" in the repository "you/you" using
 }
 </pre></notextile>
 
-h2. delete
+h3. delete
 
 Delete an existing Job.
 
@@ -166,7 +229,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Job in question.|path||
 
-h2. get
+h3. get
 
 Gets a Job's metadata by UUID.
 
@@ -176,21 +239,15 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Job in question.|path||
 
-h2. list
+h3. list
 
 List jobs.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of jobs to return.|query||
-|order|string|Order in which to return matching jobs.|query||
-|filters|array|Conditions for filtering jobs.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
 See the create method documentation for more information about Job-specific filters.
 
-h2. log_tail_follow
+h3. log_tail_follow
 
 log_tail_follow jobs
 
@@ -201,7 +258,7 @@ table(table table-bordered table-condensed).
 {background:#ccffcc}.|uuid|string||path||
 |buffer_size|integer (default 8192)||query||
 
-h2. queue
+h3. queue
 
 Get the current job queue.
 
@@ -214,7 +271,7 @@ table(table table-bordered table-condensed).
 
 This method is equivalent to the "list method":#list, except that the results are restricted to queued jobs (i.e., jobs that have not yet been started or cancelled) and order defaults to queue priority.
 
-h2. update
+h3. update
 
 Update attributes of an existing Job.
 
index 5179ccc8b216e0fceca8a838effd92730bece093..421e942faa123f3602947fee7a50b48e11ac3f01 100644 (file)
@@ -2,17 +2,43 @@
 layout: default
 navsection: api
 navmenu: API Methods
-title: "keep_disks"
+title: "keep_disks (deprecated)"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/keep_disks@
 
+Object type: @penuu@
+
+Example UUID: @zzzzz-penuu-0123456789abcde@
+
+h2. Resource
+
+Obsoleted by "keep_services":{{site.baseurl}}/api/methods/keep_services.html
+
+Each KeepDisk has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|ping_secret|string|||
+|node_uuid|string|||
+|filesystem_uuid|string|||
+|bytes_total|integer|||
+|bytes_free|integer|||
+|is_readable|boolean|||
+|is_writable|boolean|||
+|last_read_at|datetime|||
+|last_write_at|datetime|||
+|last_ping_at|datetime|||
+|keep_service_uuid|string|||
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new KeepDisk.
 
@@ -22,7 +48,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |keep_disk|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing KeepDisk.
 
@@ -32,7 +58,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the KeepDisk in question.|path||
 
-h2. get
+h3. get
 
 Gets a KeepDisk's metadata by UUID.
 
@@ -42,19 +68,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the KeepDisk in question.|path||
 
-h2. list
+h3. list
 
 List keep_disks.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of keep_disks to return.|query||
-|order|string|Order in which to return matching keep_disks.|query||
-|filters|array|Conditions for filtering keep_disks.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. ping
+h3. ping
 
 ping keep_disks
 
@@ -70,7 +90,7 @@ table(table table-bordered table-condensed).
 |service_host|string||query||
 |uuid|string||query||
 
-h2. update
+h3. update
 
 Update attributes of an existing KeepDisk.
 
index da6818b92da3bae0e87b1999fe6637ea392ea6d2..dadf783324cfffd3bb0f3edf1a46cb5ab135f048 100644 (file)
@@ -6,22 +6,36 @@ title: "keep_services"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/keep_services@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @bi6l4@
+
+Example UUID: @zzzzz-bi6l4-0123456789abcde@
+
+h2. Resource
+
+The keep_services resource keep clients to discover storage servers and proxies available on the cluster for persistent storage and retrieval of keep blocks.
+
+Each KeepService has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|service_host|string|hostname of the server||
+|service_port|integer|TCP port of the service||
+|service_ssl_flag|boolean|if the server uses SSL||
+|service_type|string|The service type, one of "disk", "blob" (cloud object store) or "proxy" (keepproxy)||
 
-h2. accessible
+h2. Methods
 
-Get a list of keep services that are accessible to the requesting client.  This
-is context-sensitive, for example providing the list of actual Keep servers
-when inside the cluster, but providing a proxy service if client contacts
-Arvados from outside the cluster.
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
 
-Takes no arguments.
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. accessible
 
-h2. create
+Get a list of keep services that are accessible to the requesting client.  Unlike @list@, this is context-sensitive based on the requester, for example providing the list of actual Keep servers when inside the cluster, but providing a proxy service if client contacts Arvados from outside the cluster.
+
+h3. create
 
 Create a new KeepService.
 
@@ -29,9 +43,9 @@ Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-|keep_disk|object||query||
+|keep_service|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing KeepService.
 
@@ -41,7 +55,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the KeepService in question.|path||
 
-h2. get
+h3. get
 
 Gets a KeepService's metadata by UUID.
 
@@ -51,19 +65,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the KeepService in question.|path||
 
-h2. list
+h3. list
 
 List keep_services.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of keep_services to return.|query||
-|order|string|Order in which to return matching keep_services.|query||
-|filters|array|Conditions for filtering keep_services.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing KeepService.
 
index 3c0bdf346d033a9cad6bb0a9adcb8cd3dedde6c9..d94a055150bc2ca6cd55c5c495db42caaf4ce6a9 100644 (file)
@@ -6,13 +6,50 @@ title: "links"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/links@
 
+Object type: @o0j2j@
+
+Example UUID: @zzzzz-o0j2j-0123456789abcde@
+
+h2. Resource
+
+Links are an extensible way to describe relationships between Arvados objects and metadata about individual objects.
+
+Each link has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|
+|head_uuid|string|The object being described or acted on.|
+|tail_uuid|string|The origin or actor in the description or action (may be null).|
+|link_class|string|Type of link|
+|name|string|Primary value of the link.|
+|properties|hash|Additional information, expressed as a key&rarr;value hash. Key: string. Value: string, number, array, or hash.|
+
+h2. Link classes
+
+Some classes are pre-defined by convention and have standard meanings attached to names.
+
+h3. permission
+
+See "permission links":{{site.baseurl}}/api/permission-model.html#links section of the permission model.
+
+h3. tag
+
+A **tag** link describes an object using an unparsed plain text string. Tags can be used to annotate objects that are not editable, like collections and objects shared as read-only.
+
+table(table table-bordered table-condensed).
+|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|
+|&rarr;Collection           | _tag name_ &rarr; _collection uuid_|
+|&rarr;Job                  | _tag name_ &rarr; _job uuid_|
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
 Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new Link.
 
@@ -22,7 +59,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |link|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Link.
 
@@ -32,7 +69,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Link in question.|path||
 
-h2. get
+h3. get
 
 Gets a Link's metadata by UUID.
 
@@ -42,29 +79,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Link in question.|path||
 
-h2. list
+h3. list
 
 List links.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of links to return.|query||
-|order|string|Order in which to return matching links.|query||
-|filters|array|Conditions for filtering links.|query||
-
-h2. render_not_found
-
-render_not_found links
-
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|a|string||path||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing Link.
 
index c5895d78a211dab8170a4b21ffcf66b6c574e33f..e5380d89397b487172510742cf266cd9d67eefb5 100644 (file)
@@ -6,14 +6,39 @@ title: "logs"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/logs@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @57u5n@
+
+Example UUID: @zzzzz-57u5n-0123456789abcde@
+
+h2. Resource
+
+Each Log has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|object_uuid|string|The arvados object that is the subject of the log.||
+|event_at|datetime|||
+|event_type|string|A user-defined category or type for this event.|@LOGIN@|
+|summary|text|||
+|properties|hash|||
+
+h3. Creation
+
+Any user may create Log entries for any event they find useful. User-generated Logs have no intrinsic meaning to other users or to the Arvados system itself; it is up to each user to choose appropriate log event types and summaries for their project.
 
+h3. System Logs
 
-h2. create
+Arvados uses Logs to record creation, deletion, and updates of other Arvados resources.
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new log entry.
 
@@ -23,7 +48,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |log|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing log entry. This method can only be used by privileged (system administrator) users.
 
@@ -33,7 +58,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the log entry in question.|path||
 
-h2. get
+h3. get
 
 Retrieve a log entry.
 
@@ -43,19 +68,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the log entry in question.|path||
 
-h2. list
+h3. list
 
 List log entries.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of log entries to return.|query||
-|order|string|Order in which to return matching log entries.|query||
-|filters|array|Conditions for filtering log entries.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing log entry. This method can only be used by privileged (system administrator) users.
 
index 7aa5896ea5314e3535182fbe5ba194902d86bc43..aa21237bfa4004135dff544aa4ab39ec551222f6 100644 (file)
@@ -6,14 +6,36 @@ title: "nodes"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/nodes@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @7ekkf@
+
+Example UUID: @zzzzz-7ekkf-0123456789abcde@
+
+h2. Resource
+
+Node resources list compute nodes on which Crunch may schedule work.
+
+Each Node has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|slot_number|integer|||
+|hostname|string|||
+|domain|string|||
+|ip_address|string|||
+|job_uuid|string|The UUID of the job that this node is assigned to work on.  If you do not have permission to read the job, this will be null.||
+|first_ping_at|datetime|||
+|last_ping_at|datetime|||
+|info|hash|||
 
+h2. Methods
 
-h2. create
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new Node.
 
@@ -23,7 +45,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|node|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Node.
 
@@ -33,7 +55,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Node in question.|path||
 
-h2. get
+h3. get
 
 Gets a Node's metadata by UUID.
 
@@ -43,21 +65,15 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Node in question.|path||
 
-h2. list
+h3. list
 
 List nodes.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of nodes to return.|query||
-|order|string|Order in which to return matching nodes.|query||
-|filters|array|Conditions for filtering nodes.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. ping
+h3. ping
 
-ping nodes
+Process a ping from a compute node.
 
 Arguments:
 
@@ -66,7 +82,7 @@ table(table table-bordered table-condensed).
 {background:#ccffcc}.|ping_secret|string||query||
 {background:#ccffcc}.|uuid|string||path||
 
-h2. update
+h3. update
 
 Update attributes of an existing Node.
 
index d637a696eb83de397c9bae0b972b64b156e555b3..f4fb774cf48d3bc921877816f9d6ee155e5b9433 100644 (file)
@@ -6,14 +6,34 @@ title: "pipeline_instances"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/pipeline_instances@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @d1hrv@
+
+Example UUID: @zzzzz-d1hrv-0123456789abcde@
+
+h2. Resource
+
+Deprecated.  A pipeline instance is a collection of jobs managed by @aravdos-run-pipeline-instance@.
+
+Each PipelineInstance has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|pipeline_template_uuid|string|The "pipeline template":pipeline_templates.html that this instance was created from.||
+|name|string|||
+|components|hash|||
+|success|boolean|||
+|active|boolean|||
+|properties|Hash|||
 
+h2. Methods
 
-h2. create
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new PipelineInstance.
 
@@ -23,7 +43,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |pipeline_instance|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing PipelineInstance.
 
@@ -33,7 +53,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the PipelineInstance in question.|path||
 
-h2. get
+h3. get
 
 Gets a PipelineInstance's metadata by UUID.
 
@@ -43,19 +63,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the PipelineInstance in question.|path||
 
-h2. list
+h3. list
 
 List pipeline_instances.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of pipeline_instances to return.|query||
-|order|string|Order in which to return matching pipeline_instances.|query||
-|filters|array|Conditions for filtering pipeline_instances.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing PipelineInstance.
 
index 06684cc6df05ab1f32f17e362cc6b52f8ac2eeae..e8fb6a4c596a59718cae5cc2608476660e6caa8b 100644 (file)
@@ -6,14 +6,172 @@ title: "pipeline_templates"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/pipeline_templates@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @p5p6p@
+
+Example UUID: @zzzzz-p5p6p-0123456789abcde@
+
+h2. Resource
+
+Deprecated.  A pipeline template is a collection of jobs that can be instantiated as a pipeline_instance.
+
+Each PipelineTemplate has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|||
+|components|hash|||
+
+The pipeline template consists of "name" and "components".
+
+table(table table-bordered table-condensed).
+|_. Attribute    |_. Type |_. Accepted values                           |_. Required|_. Description|
+|name            |string  |any                                          |yes        |The human-readable name of the pipeline template.|
+|components      |object  |JSON object containing job submission objects|yes        |The component jobs that make up the pipeline, with the component name as the key. |
+
+h3. Components
 
+The components field of the pipeline template is a JSON object which describes the individual steps that make up the pipeline.  Each component is an Arvados job submission.  "Parameters for job submissions are described on the job method page.":{{site.baseurl}}/api/methods/jobs.html#create  In addition, a component can have the following parameters:
 
-h2. create
+table(table table-bordered table-condensed).
+|_. Attribute    |_. Type          |_. Accepted values |_. Required|_. Description|
+|output_name     |string or boolean|string or false    |no         |If a string is provided, use this name for the output collection of this component.  If the value is false, do not create a permanent output collection (an temporary intermediate collection will still be created).  If not provided, a default name will be assigned to the output.|
+
+h3. Script parameters
+
+When used in a pipeline, each parameter in the 'script_parameters' attribute of a component job can specify that the input parameter must be supplied by the user, or the input parameter should be linked to the output of another component.  To do this, the value of the parameter should be JSON object containing one of the following attributes:
+
+table(table table-bordered table-condensed).
+|_. Attribute    |_. Type |_. Accepted values                               |_. Description|
+|default         |any     |any                                              |The default value for this parameter.|
+|required        |boolean |true or false                                    |Specifies whether the parameter is required to have a value or not.|
+|dataclass       |string  |One of 'Collection', 'File' [1], 'number', or 'text' |Data type of this parameter.|
+|search_for      |string  |any string                                       |Substring to use as a default search string when choosing inputs.|
+|output_of       |string  |the name of another component in the pipeline    |Specifies that the value of this parameter should be set to the 'output' attribute of the job that corresponds to the specified component.|
+|title           |string  |any string                                       |User friendly title to display when choosing parameter values|
+|description     |string  |any string                                       |Extended text description for describing expected/valid values for the script parameter|
+|link_name       |string  |any string                                       |User friendly name to display for the parameter value instead of the actual parameter value|
+
+The 'output_of' parameter is especially important, as this is how components are actually linked together to form a pipeline.  Component jobs that depend on the output of other components do not run until the parent job completes and has produced output.  If the parent job fails, the entire pipeline fails.
+
+fn1. The 'File' type refers to a specific file within a Keep collection in the form 'collection_hash/filename', for example '887cd41e9c613463eab2f0d885c6dd96+83/bob.txt'.
+
+The 'search_for' parameter is meaningful only when input dataclass of type Collection or File is used. If a value is provided, this will be preloaded into the input data chooser dialog in Workbench. For example, if your input dataclass is a File and you are interested in a certain filename extention, you can preconfigure it in this attribute.
+
+h3. Examples
+
+This is a pipeline named "Filter MD5 hash values" with two components, "do_hash" and "filter".  The "input" script parameter of the "do_hash" component is required to be filled in by the user, and the expected data type is "Collection".  This also specifies that the "input" script parameter of the "filter" component is the output of "do_hash", so "filter" will not run until "do_hash" completes successfully.  When the pipeline runs, past jobs that meet the criteria described above may be substituted for either or both components to avoid redundant computation.
+
+<notextile><pre>
+{
+  "name": "Filter MD5 hash values",
+  "components": {
+    "do_hash": {
+      "script": "hash.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": {
+        "input": {
+          "required": true,
+          "dataclass": "Collection",
+          "search_for": ".fastq.gz",
+          "title":"Please select a fastq file"
+        }
+      },
+    },
+    "filter": {
+      "script": "0-filter.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": {
+        "input": {
+          "output_of": "do_hash"
+        }
+      },
+    }
+  }
+}
+</pre></notextile>
+
+This pipeline consists of three components.  The components "thing1" and "thing2" both depend on "cat_in_the_hat".  Once the "cat_in_the_hat" job is complete, both "thing1" and "thing2" can run in parallel, because they do not depend on each other.
+
+<notextile><pre>
+{
+  "name": "Wreck the house",
+  "components": {
+    "cat_in_the_hat": {
+      "script": "cat.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": { }
+    },
+    "thing1": {
+      "script": "thing1.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": {
+        "input": {
+          "output_of": "cat_in_the_hat"
+        }
+      },
+    },
+    "thing2": {
+      "script": "thing2.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": {
+        "input": {
+          "output_of": "cat_in_the_hat"
+        }
+      },
+    },
+  }
+}
+</pre></notextile>
+
+This pipeline consists of three components.  The component "cleanup" depends on "thing1" and "thing2".  Both "thing1" and "thing2" are started immediately and can run in parallel, because they do not depend on each other, but "cleanup" cannot begin until both "thing1" and "thing2" have completed.
+
+<notextile><pre>
+{
+  "name": "Clean the house",
+  "components": {
+    "thing1": {
+      "script": "thing1.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": { }
+    },
+    "thing2": {
+      "script": "thing2.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": { }
+    },
+    "cleanup": {
+      "script": "cleanup.py",
+      "repository": "<b>you</b>/<b>you</b>",
+      "script_version": "master",
+      "script_parameters": {
+        "mess1": {
+          "output_of": "thing1"
+        },
+        "mess2": {
+          "output_of": "thing2"
+        }
+      }
+    }
+  }
+}
+</pre></notextile>
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new PipelineTemplate.
 
@@ -23,7 +181,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |pipeline_template|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing PipelineTemplate.
 
@@ -33,7 +191,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the PipelineTemplate in question.|path||
 
-h2. get
+h3. get
 
 Gets a PipelineTemplate's metadata by UUID.
 
@@ -43,19 +201,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the PipelineTemplate in question.|path||
 
-h2. list
+h3. list
 
 List pipeline_templates.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of pipeline_templates to return.|query||
-|order|string|Order in which to return matching pipeline_templates.|query||
-|filters|array|Conditions for filtering pipeline_templates.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing PipelineTemplate.
 
index 7bd8dd9d4216c2049083a2a0be9c62ec57b6c869..80dfc0b49c1877896aea0741e5b99cc2089854be 100644 (file)
@@ -6,14 +6,33 @@ title: "repositories"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/repositories@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @s0uqq@
+
+Example UUID: @zzzzz-s0uqq-0123456789abcde@
+
+h2. Resource
+
+The repositories resource lists git repositories managed by Arvados.
+
+Each Repository has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|The name of the repository on disk.  Repository names must begin with a letter and contain only alphanumerics.  Unless the repository is owned by the system user, the name must begin with the owner's username, then be separated from the base repository name with @/@.  You may not create a repository that is owned by a user without a username.|@username/project1@|
+|clone_urls|array|URLs from which the repository can be cloned. Read-only.|@["git@git.zzzzz.arvadosapi.com:foo/bar.git",
+ "https://git.zzzzz.arvadosapi.com/foo/bar.git"]@|
+|fetch_url|string|URL suggested as a fetch-url in git config. Deprecated. Read-only.||
+|push_url|string|URL suggested as a push-url in git config. Deprecated. Read-only.||
 
+h2. Methods
 
-h2. create
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new Repository.
 
@@ -23,7 +42,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |repository|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Repository.
 
@@ -33,7 +52,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Repository in question.|path||
 
-h2. get
+h3. get
 
 Gets a Repository's metadata by UUID.
 
@@ -43,7 +62,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Repository in question.|path||
 
-h2. get_all_permissions
+h3. get_all_permissions
 
 get_all_permissions repositories
 
@@ -52,19 +71,13 @@ Arguments:
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 
-h2. list
+h3. list
 
 List repositories.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of repositories to return.|query||
-|order|string|Order in which to return matching repositories.|query||
-|filters|array|Conditions for filtering repositories.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing Repository.
 
index 6737c9bcae8b2ebb08ec54b7445065d2d011110a..652497d3f958096fca494b257bedcbabfa113bf5 100644 (file)
@@ -3,17 +3,32 @@ layout: default
 navsection: api
 navmenu: API Methods
 title: "specimens"
-
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/specimens@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @j58dm@
+
+Example UUID: @zzzzz-j58dm-0123456789abcde@
+
+h2. Resource
+
+A metadata record that may be used to represent a biological specimen.
+
+Each Specimen has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|material|string|||
+|properties|hash|||
+
+h2. Methods
 
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new Specimen.
 
@@ -23,7 +38,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |specimen|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Specimen.
 
@@ -33,7 +48,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Specimen in question.|path||
 
-h2. get
+h3. get
 
 Gets a Specimen's metadata by UUID.
 
@@ -43,19 +58,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Specimen in question.|path||
 
-h2. list
+h3. list
 
 List specimens.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of specimens to return.|query||
-|order|string|Order in which to return matching specimens.|query||
-|filters|array|Conditions for filtering specimens.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing Specimen.
 
index 9b19a0880b30d9f3ca22e9dc411a8df0a5132dfc..3f7d49f69101c045d5287a5d81587343d9dd96cc 100644 (file)
@@ -6,14 +6,30 @@ title: "traits"
 
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/traits@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @q1cn2@
+
+Example UUID: @zzzzz-q1cn2-0123456789abcde@
+
+h2. Resource
+
+A metadata record that may be used to represent a genotype or phenotype trait.
+
+Each Trait has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|||
+|properties|hash|||
 
+h2. Methods
 
-h2. create
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new Trait.
 
@@ -23,7 +39,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |trait|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing Trait.
 
@@ -33,7 +49,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Trait in question.|path||
 
-h2. get
+h3. get
 
 Gets a Trait's metadata by UUID.
 
@@ -43,19 +59,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Trait in question.|path||
 
-h2. list
+h3. list
 
 List traits.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of traits to return.|query||
-|order|string|Order in which to return matching traits.|query||
-|filters|array|Conditions for filtering traits.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing Trait.
 
index 33f884b6cc7ffd9599343503a34db89ee90ff6ad..451205b48ee6b88351a3ca2927794007c2391b32 100644 (file)
@@ -3,17 +3,40 @@ layout: default
 navsection: api
 navmenu: API Methods
 title: "users"
-
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/users@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @tpzed@
 
+Example UUID: @zzzzz-tpzed-0123456789abcde@
 
-h2. create
+h2. Resource
+
+Users represent individuals with access to the Arvados cluster.
+
+Each User has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|email|string|||
+|username|string|The username used for the user's git repositories and virtual machine logins.  Usernames must start with a letter, and contain only alphanumerics.  When a new user is created, a default username is set from their e-mail address.  Only administrators may change the username.||
+|first_name|string|||
+|last_name|string|||
+|identity_url|string|||
+|is_admin|boolean|||
+|prefs|hash|||
+|default_owner_uuid|string|||
+|is_active|boolean|||
+|writable_by|array|List of UUID strings identifying Groups and other Users that can modify this User object.  This will include the user's owner_uuid and, for administrators and users requesting their own User object, the requesting user's UUID.||
+
+h2. Methods
+
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
+
+h3. create
 
 Create a new User.
 
@@ -23,16 +46,16 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |user|object||query||
 
-h2. current
+h3. current
 
-current users
+Get the user associated with the provided API token.
 
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 
-h2. delete
+h3. delete
 
 Delete an existing User.
 
@@ -48,7 +71,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string||path||
 
-h2. get
+h3. get
 
 Gets a User's metadata by UUID.
 
@@ -58,38 +81,22 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the User in question.|path||
 
-h2. list
+h3. list
 
 List users.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of users to return.|query||
-|order|string|Order in which to return matching users.|query||
-|filters|array|Conditions for filtering users.|query||
-
-h2. show
-
-show users
-
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|uuid|string||path||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. system
+h3. system
 
-system users
+Get the user record for the "system user.":{{site.baseurl}}/api/permission-model.html#system
 
 Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 
-h2. update
+h3. update
 
 Update attributes of an existing User.
 
index 390abdc595893964893a151387432185a04ba9af..cad9bcbb1a785d587a93995e6a1ff22cd4286f23 100644 (file)
@@ -3,17 +3,31 @@ layout: default
 navsection: api
 navmenu: API Methods
 title: "virtual_machines"
-
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/virtual_machines@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @2x53u@
+
+Example UUID: @zzzzz-2x53u-0123456789abcde@
+
+h2. Resource
+
+The virtual_machines resource lists compute resources in the Arvados cluster to which a user may log in to get an interactive shell (via ssh or webshell).
+
+Each VirtualMachine has, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|hostname|string|||
+
+h2. Methods
 
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new VirtualMachine.
 
@@ -23,7 +37,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 |virtual_machine|object||query||
 
-h2. delete
+h3. delete
 
 Delete an existing VirtualMachine.
 
@@ -33,7 +47,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the VirtualMachine in question.|path||
 
-h2. get
+h3. get
 
 Gets a VirtualMachine's metadata by UUID.
 
@@ -43,7 +57,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the VirtualMachine in question.|path||
 
-h2(#logins). logins
+h3(#logins). logins
 
 Get a list of SSH keys and account names that should be able to log in to a given virtual machine.
 
@@ -53,7 +67,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string||path||
 
-The response is a "resource list":{{site.baseurl}}/api/resources.html#resourceList with @kind@ set to @"arvados#HashList"@. Each item is a hash with the following keys:
+The response is an object with the field @items@ containing an array of objects in the following format:
 
 table(table table-bordered table-condensed).
 |_. Key|_. Value type|_. Description|_. Example|
@@ -61,30 +75,24 @@ table(table table-bordered table-condensed).
 |hostname|string|Hostname of the virtual machine|@"shell.xyzzy.arvadosapi.com"@|
 |public_key|string|SSH public key|@"ssh-rsa AAAAB3NzaC1yc2E..."@|
 |user_uuid|string|UUID of the user who should be able to log in|@"xyzzy-tpzed-mv4d7dy7n91te11"@|
-|virtual_machine_uuid|string|UUID of the "VirtualMachine resource":{{site.baseurl}}/api/schema/VirtualMachine.html|@"xyzzy-2x53u-kvszmclnbjuv8xc"@|
-|authorized_key_uuid|string|UUID of the "AuthorizedKey resource":{{site.baseurl}}/api/schema/AuthorizedKey.html|@"xyzzy-fngyi-v9p0cyfmjxbio64"@|
+|virtual_machine_uuid|string|UUID of the "virtual machine resource":{{site.baseurl}}/api/methods/virtual_machines.html|@"zzzzz-2x53u-kvszmclnbjuv8xc"@|
+|authorized_key_uuid|string|UUID of the "authorized key resource":{{site.baseurl}}/api/methods/authorized_keys.html|@"zzzzz-fngyi-v9p0cyfmjxbio64"@|
 
-h2. get_all_logins
+h3. get_all_logins
 
-Get a list, for every virtual machine in the system, of SSH keys and account names that should be able to log in.
+Get a list of SSH keys and account names that should be able to log in for every virtual machine in the system.
 
 Arguments: none.
 
 The response has the same format as the response to the "logins method":#logins above.
 
-h2. list
+h3. list
 
 List virtual_machines.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of virtual_machines to return.|query||
-|order|string|Order in which to return matching virtual_machines.|query||
-|filters|array|Conditions for filtering virtual_machines.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing VirtualMachine.
 
index 95be013b621d92e5f534ba42ec94af96d3a56ed8..57b301a3b9022fb8deb2dfaf5a6fe2e6f6d0b0a1 100644 (file)
@@ -3,17 +3,33 @@ layout: default
 navsection: api
 navmenu: API Methods
 title: "workflows"
-
 ...
 
-See "REST methods for working with Arvados resources":{{site.baseurl}}/api/methods.html
-
 API endpoint base: @https://{{ site.arvados_api_host }}/arvados/v1/workflows@
 
-Required arguments are displayed in %{background:#ccffcc}green%.
+Object type: @7fd4e@
+
+Example UUID: @zzzzz-7fd4e-0123456789abcde@
+
+h2. Resource
+
+Stores a "Common Workflow Language":http://commonwl.org (CWL) computational workflow that can be searched for, browsed and executed (submitted to Crunch) from the workbench.
+
+Each Workflow offers the following optional attributes, in addition to the "Common resource fields":{{site.baseurl}}/api/resources.html:
+
+table(table table-bordered table-condensed).
+|_. Attribute|_. Type|_. Description|_. Example|
+|name|string|If not specified, will be set to any "name" from the "definition" attribute.||
+|description|string|If not specified, will be set to any "description" from the "definition" attribute.||
+|definition|string|A "Common Workflow Language" document.|Visit "Common Workflow Language":http://www.commonwl.org/ for details.|
+
+h2. Methods
 
+See "Common resource methods":{{site.baseurl}}/api/methods.html for more information about @create@, @delete@, @get@, @list@, and @update@.
+
+Required arguments are displayed in %{background:#ccffcc}green%.
 
-h2. create
+h3. create
 
 Create a new Workflow.
 
@@ -21,9 +37,9 @@ Arguments:
 
 table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
-{background:#ccffcc}.|workflow|object|See "Workflow resource":{{site.baseurl}}/api/schema/Workflow.html|request body||
+{background:#ccffcc}.|workflow|object|Workflow resource|request body||
 
-h2. delete
+h3. delete
 
 Delete an existing Workflow.
 
@@ -33,7 +49,7 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Workflow in question.|path||
 
-h2. get
+h3. get
 
 Get a Workflow's metadata by UUID.
 
@@ -43,19 +59,13 @@ table(table table-bordered table-condensed).
 |_. Argument |_. Type |_. Description |_. Location |_. Example |
 {background:#ccffcc}.|uuid|string|The UUID of the Workflow in question.|path||
 
-h2. list
+h3. list
 
 List workflows.
 
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-|limit|integer (default 100)|Maximum number of workflows to return.|query||
-|order|string|Order in which to return matching workflows.|query||
-|filters|array|Conditions for filtering workflows.|query||
+See "common resource list method.":{{site.baseurl}}/api/methods.html#index
 
-h2. update
+h3. update
 
 Update attributes of an existing Workflow.
 
index 8b085ee5aaffd1a99c27a0350a134a38f31a269b..62cd74d9d72c35d7a86c23e56f32e29fcfef422d 100644 (file)
@@ -3,123 +3,70 @@ layout: default
 navsection: api
 navmenu: Concepts
 title: "Permission model"
-
 ...
 
+* There are four levels of permission: *none*, *can_read*, *can_write*, and *can_manage*.
+** *none* is the default state when there are no other permission grants.
+*** the object is not included in any list query response.
+*** direct queries of the object by uuid return 404 Not Found.
+*** Link objects require valid identifiers in @head_uuid@ and @tail_uuid@, so an attempt to create a Link that references an unreadable object will return an error indicating the object is not found.
+** *can_read* grants read-only access to the record.  Attempting to update or delete the record returns an error.  *can_read* does not allow a reader to see any permission grants on the object except the object's owner_uuid and the reader's own permissions.
+** *can_write* permits changes to the record (but not permission links).  *can_write* permits the user to delete the object.  *can_write* also implies *can_read*.
+** *can_manage* permits the user to read, create, update and delete permission links whose @head_uuid@ is this object's @uuid@.  *can_manage* also implies *can_write* and *can_read*.
 
+h2. Ownership
 
-Each API transaction (read, write, create, etc.) is done on behalf of a person.
-
-* An end user, via a web app
-* The owner of an installed app
-
-A user (person) is permitted to act on an object if there is a path (series of permission Links) from the acting user to the object in which
-
-* Every intervening object is a Group, and
-* Every intervening permission Link allows the current action
-
-Special case: A permission path can also include intervening User objects if the links _to_ the Users are "can_manage" links.
-
-Each object has exactly one _owner_, which can be either a User or a Group.
-
-* If the owner of X is A, then A is permitted to do any action on X.
-
-h3. Tokens
-
-An authorization token is issued at a user's request, and supplied to an API client using some suitable mechanism (_e.g._, cookie or application config file for a web app; environment variable or .rc-file for a CLI app).
-
-A user can have multiple valid tokens at a given time.  At the user's option, a token can be restricted to a combination of
-
-* API client program
-* time interval
-* transaction type
-
-h3. System pseudo-user
-
-A privileged user account exists for the use of built-in Arvados system components.  This user manages system-wide shared objects which can't really be "owned" by any particular user, like
-
-* Jobs and job steps (because a given job can be "wanted" by multiple users)
-* Provenance metadata (because no user should be able to modify this directly)
-* Storage metadata like
-** redundancy verified as N&times; at time Y
-** contents of collections A and B are identical
-
-The system pseudo-user's uuid is @{siteprefix}-tpzed-000000000000000@.
-
-h2. Example scenarios
-
-h3. 1. Private objects
-
-Alfred stores 3 data Collections in Keep and adds them to a new Group.
-
-The Collections and the Group can only be seen by Alfred, administrators, and the system user.
-
-The data in the Collections can only be retrieved by Alfred, administrators, and the system user.
-
-h3. 2. Public objects
-
-George creates a "PGP public data" Group, and grants "read" permission to all users.
-
-* ...by adding a Link: "All users" Group _can_read_&rarr; "PGP public data" Group
-
-George stores 4 data Collections in Keep and adds them to the "PGP public data" Group
+* All Arvados objects have an @owner_uuid@ field. Valid uuid types for @owner_uuid@ are "User" and "Group".
+* The User or Group specified by @owner_uuid@ has *can_manage* permission on the object.
+** This permission is one way: A User or Group's @owner_uuid@ being equal to @X@ does not imply any permission for that User/Group to read, write, or manage an object whose @uuid@ is equal to @X@.
+* Applications should represent each object as belonging to, or being "inside", the Group/User referenced by its @owner_uuid@.
+** A "project" is a subtype of Group that is treated as a "Project" in Workbench, and as a directory by @arv-mount@.
+** A "role" is a subtype of Group that is treated in Workbench as a group of users who have permissions in common (typically an organizational group).
+* To change the @owner_uuid@ field, it is necessary to have @can_write@ permission on both the current owner and the new owner.
 
-* ...by adding a Link: Group _can_read_&rarr; Collection
+h2(#links). Permission links
 
-Anyone who can connect to Arvados can log in with a Google/OpenID account and read the data.
+A link object with
 
-h3. 3. Group-managed objects
+* @owner_uuid@ of the system user.
+* @link_class@ "permission"
+* @name@ one of *can_read*, *can_write* or *can_manage*
+* @head_uuid@ of some Arvados object
+* @tail_uuid@ of a User or Group
 
-Three lab members are working together on a project. All Specimens, Links, Jobs, etc. can be modified by any of the three lab members. _Other_ lab members, who are not working on this project, can view but not modify these objects.
+grants the @name@ permission for @tail_uuid@ accessing @head_uuid@
 
-h3. 4. Group-level administrator
+* If a User has *can_manage* permission on some object, this grants permission to read, create, update and delete permission links where the @head_uuid@ is the object under management.
 
-The Ashton Lab administrator, Alison, manages user accounts within her lab. She can enable and disable accounts, and exercise any permission that her lab members have.
+h3. Transitive permissions
 
-George has read-only access to the same set of accounts. This lets him see things like user activity and resource usage reports, without worrying about accidentally messing up anyone's data.
+Permissions can be obtained indirectly through Groups.
+* If a User X *can_read* Group A, and Group A *can_read* Object B, then User X *can_read* Object B.
+* Permissions are narrowed to the least powerful permission on the path.
+** If User X *can_write* Group A, and Group A *can_read* Object B, then User X *can_read* Object B.
+** If User X *can_read* Group A, and Group A *can_write* Object B, then User X *can_read* Object B.
 
-table(table table-bordered table-condensed).
-|Tail                   |Permission     |Head                      |Effect|
-|Group: Ashton Lab Admin|can_manage     |User: Lab Member 1        |Lab member 1 is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: Lab Member 2        |Lab member 2 is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: Lab Member 3        |Lab member 3 is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: Alison              |Alison is in this administrative group|
-|Group: Ashton Lab Admin|can_manage     |User: George              |George is in this administrative group|
-|Alison                 |can_manage     |Group: Ashton Lab Admin   |Alison can do everything the above lab members can do|
-|George                 |can_read       |Group: Ashton Lab Admin   |George can read everything the above lab members can read|
+h2. Group Membership
 
-h3. 5. Segregated roles
+Group membership is determined by whether the group has *can_read* permission on an object.  If a group G *can_read* an object A, then we say A is a member of G.
 
-Granwyth, at the Hulatberi Lab, sets up a Factory Robot which uses a hosted Arvados site to do work for the Hulatberi Lab.
+For some kinds of groups, like roles, it is natural for users who are members of a group to also have *can_manage* permission on the group, i.e., G *can_read* A  and A *can_manage* G ("A can do anything G can do"). However, this is not necessary: A can be a member of a group while being unable to even read it.
 
-Frank uploads a data Collection using Factory Robot's upload interface.  Factory Robot sets data owner to Hulatberi Lab.
+h2. Special cases
 
-Factory Robot processes the data using a pipeline.
+* Log table objects are additionally readable based on whether the User has *can_read* permission on @object_uuid@ (User can access log history about objects it can read).  To retain the integrity of the log, the log table should deny all update or delete operations.
+* Permission links where @tail_uuid@ is a User permit @can_read@ on the link by that user.  (User can discover her own permission grants.)
+* *can_read* on a Collection grants permission to read the blocks that make up the collection (API server returns signed blocks)
+* If User or Group X *can_FOO* Group A, and Group A *can_manage* User B, then X *can_FOO* _everything that User B can_FOO_.
 
-Factory Robot grants permission for anyone in the Ingeborg Lab (a Hulateberi Lab customer) to read the output of the pipeline, as well as the pipeline invocation details.  (Say, Ingeborg and Jill.)
+h2(#system). System user and group
 
-During and after processing, all members of the Hulatberi Lab (_e.g._, Mike) can inspect pipeline progress, read source/intermediate/output data, and modify objects.
+A privileged user account exists for the use by internal Arvados components.  This user manages system objects which should not be "owned" by any particular user.  The system user uuid is @{siteprefix}-tpzed-000000000000000@.
 
-Possible encoding:
+h2. Anoymous user and group
 
-table(table table-bordered table-condensed).
-|Tail           |Permission     |Head                      |Effect|
-|Frank          |(none)         |                          |Factory Robot uses only its own credentials during upload|
-|Granwyth       |can_manage     |User:    Factory Robot    |can revoke tokens, view activity... (needed?)|
-|Granwyth       |can_manage     |Group: Hulatberi Lab    |can grant group-write permission to Factory Robot|
-|Factory Robot  |can_write      |Group: Hulatberi Lab    |can add data, pipelines, jobs, etc. to the Lab group|
-|Mike           |can_write      |Group: Hulatberi Lab    |can edit/annotate/delete objects that belong to the Lab|
+An Arvado site may be configued to allow users to browse resources without requiring a log in.  In this case, permissions for non-logged-in users are associated with the "anonymous" user.  To make objects visible to the public, they can be shared with the "anonymous" group.  The anonymous user uuid is @{siteprefix}-tpzed-anonymouspublic@.  The anonymous group uuid is @{siteprefix}-j7d0g-anonymouspublic@.
 
-h3. Actions governed by permissions
+h2. Example
 
-table(table table-bordered table-condensed).
-|_Action_|_Permissions needed_|
-|Retrieve data from Keep|can_read (system-wide?)|
-|Store data in Keep|can_write (system-wide?)|
-|Add a Collection to Arvados|can_write (system-wide?)|
-|Run a job|can_run (system-wide?)|
-|See progress/result of a job|can_read (on job)|
-|Give group permissions to a user/group|can_manage (on group)|
-|Revoke group permissions from a user/group|can_manage (on group)|
-|Change owner of an object|can_manage (on object)|
-|Add an object to a group|can_write (on group)|
+!{{site.baseurl}}/images/Arvados_Permissions.svg!
diff --git a/doc/api/requests.html.textile.liquid b/doc/api/requests.html.textile.liquid
new file mode 100644 (file)
index 0000000..e720395
--- /dev/null
@@ -0,0 +1,349 @@
+---
+layout: default
+navsection: api
+navmenu: Concepts
+title: REST API syntax
+...
+
+Arvados exposes a REST API using standard HTTP requests.
+
+h3. HTTP Method
+
+Use @GET@ to request individual resources or lists of resources.
+
+Use @POST@ to create new resources.
+
+Use @PUT@ to update an existing resource.
+
+Use @DELETE@ to remove an existing resource.
+
+As a special case, a @POST@ with the query parameter @_method=GET@ will be treated as a GET request.  This makes it possible to issue @GET@ requests where the query string exceeds the maximum request URI length, by putting the query string in the body of the request.
+
+h3. Request URI
+
+The URI portion of the request identifies the specific resource to operate on.  For example, operations on "collections":{{site.baseurl}}/api/methods/collections.html use the @https://{{ site.arvados_api_host }}/arvados/v1/collections@ request URI prefix.
+
+h3. Authorization header
+
+Every request must include an API token.  This identifies the user making the request for the purposes of access control.  In addition, tokens may be further "restricted in scope":{{site.baseurl}}/api/methods/api_client_authorizations.html#scope to only access certain API endpoints.
+
+API requests must provide the API token using the @Authorization@ header in the following format:
+
+<pre>
+$ curl -v -H "Authorization: OAuth2 xxxxapitokenxxxx" https://192.168.5.2:8000/arvados/v1/collections
+> GET /arvados/v1/collections HTTP/1.1
+> ...
+> Authorization: OAuth2 xxxxapitokenxxxx
+> ...
+</pre>
+
+h3. Parameters
+
+Request parameters may be provided in one of two ways.  They may be provided in the "query" section of request URI, or they may be provided in the body of the request with application/x-www-form-urlencoded encoding.  If parameters are provided in both places, their values will be merged.  Parameter names must be unique.  If a parameter appears multiple times, the behavior is undefined.
+
+Structured and nested parameter values must be provided as urlencoded JSON.
+
+h3. Result
+
+Results are returned JSON-encoded in the response body.
+
+h3. Errors
+
+If a request cannot be fulfilled, the API will return 4xx or 5xx HTTP status code.  Be aware that the API server may return a 404 (Not Found) status for resources that exist but for which the client does not have read access.  The API will also return an error record:
+
+table(table table-bordered table-condensed).
+|*Parameter name*|*Value*|*Description*|
+|errors|array|An array of one or more error messages|
+|error_token|string|a unique identifier used to correlate the error in the API server logs|
+
+h2. Examples
+
+h3. Create a new record
+
+<pre>
+$ curl -v -X POST --data-urlencode 'collection={"name":"empty collection"}' -H "Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr" https://192.168.5.2:8000/arvados/v1/collections | jq .
+> POST /arvados/v1/collections HTTP/1.1
+> User-Agent: curl/7.38.0
+> Host: 192.168.5.2:8000
+> Accept: */*
+> Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr
+> Content-Length: 54
+> Content-Type: application/x-www-form-urlencoded
+>
+} [data not shown]
+< HTTP/1.1 200 OK
+< Content-Type: application/json; charset=utf-8
+< Transfer-Encoding: chunked
+< Connection: keep-alive
+< Status: 200 OK
+< Access-Control-Allow-Origin: *
+< Access-Control-Allow-Methods: GET, HEAD, PUT, POST, DELETE
+< Access-Control-Allow-Headers: Authorization
+< Access-Control-Max-Age: 86486400
+< X-UA-Compatible: IE=Edge,chrome=1
+< ETag: "2ec9ef5151c1f7a1486ad169c33ae462"
+< Cache-Control: max-age=0, private, must-revalidate
+< Set-Cookie: _server_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFVEkiJTIwMjQ1NTE5YmEwMzU1MGZkMTBmYmY1YzllY2ZiMjFlBjsAVA%3D%3D--653bc9c20899d48ee8523e18d9a4c1cde0702577; path=/; HttpOnly
+< X-Request-Id: 56aa10bc49097f3b44d3ed946bf0e61e
+< X-Runtime: 0.049951
+< X-Powered-By: Phusion Passenger 4.0.41
+< Date: Fri, 28 Oct 2016 19:20:09 GMT
+< Server: nginx/1.4.7 + Phusion Passenger 4.0.41
+<
+{
+  "href": "/collections/962eh-4zz18-m1ma0mxxfg3mbcc",
+  "kind": "arvados#collection",
+  "etag": "c5ifrv1ox2tu6alb559ymtkb7",
+  "uuid": "962eh-4zz18-m1ma0mxxfg3mbcc",
+  "owner_uuid": "962eh-tpzed-000000000000000",
+  "created_at": "2016-10-28T19:20:09.320771531Z",
+  "modified_by_client_uuid": "962eh-ozdt8-lm5x8emraox8epg",
+  "modified_by_user_uuid": "962eh-tpzed-000000000000000",
+  "modified_at": "2016-10-28T19:20:09.319661000Z",
+  "name": "empty collection",
+  "description": null,
+  "properties": {},
+  "portable_data_hash": "d41d8cd98f00b204e9800998ecf8427e+0",
+  "manifest_text": "",
+  "replication_desired": null,
+  "replication_confirmed": null,
+  "replication_confirmed_at": null,
+  "expires_at": null
+}
+</pre>
+
+h3. Delete a record
+
+<pre>
+$ curl -X DELETE -v -H "Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr" https://192.168.5.2:8000/arvados/v1/collections/962eh-4zz18-m1ma0mxxfg3mbcc | jq .
+> DELETE /arvados/v1/collections/962eh-4zz18-m1ma0mxxfg3mbcc HTTP/1.1
+> User-Agent: curl/7.38.0
+> Host: 192.168.5.2:8000
+> Accept: */*
+> Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr
+>
+< HTTP/1.1 200 OK
+< Content-Type: application/json; charset=utf-8
+< Transfer-Encoding: chunked
+< Connection: keep-alive
+< Status: 200 OK
+< Access-Control-Allow-Origin: *
+< Access-Control-Allow-Methods: GET, HEAD, PUT, POST, DELETE
+< Access-Control-Allow-Headers: Authorization
+< Access-Control-Max-Age: 86486400
+< X-UA-Compatible: IE=Edge,chrome=1
+< ETag: "1e8f72802cf1a6d0a5c4a1ebbfcc46a9"
+< Cache-Control: max-age=0, private, must-revalidate
+< Set-Cookie: _server_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFVEkiJTc2NDYyY2M0NTNlNmU3M2Y2M2E3YmFiMWQ1MTEyZGZkBjsAVA%3D%3D--d28c7dd640bd24e2b12f01e77088072138dcf145; path=/; HttpOnly
+< X-Request-Id: e66fd3ab825bdb87301f5456161fb641
+< X-Runtime: 0.028788
+< X-Powered-By: Phusion Passenger 4.0.41
+< Date: Fri, 28 Oct 2016 19:33:31 GMT
+< Server: nginx/1.4.7 + Phusion Passenger 4.0.41
+<
+{
+  "href": "/collections/962eh-4zz18-m1ma0mxxfg3mbcc",
+  "kind": "arvados#collection",
+  "etag": "c5ifrv1ox2tu6alb559ymtkb7",
+  "uuid": "962eh-4zz18-m1ma0mxxfg3mbcc",
+  "owner_uuid": "962eh-tpzed-000000000000000",
+  "created_at": "2016-10-28T19:20:09.320771000Z",
+  "modified_by_client_uuid": "962eh-ozdt8-lm5x8emraox8epg",
+  "modified_by_user_uuid": "962eh-tpzed-000000000000000",
+  "modified_at": "2016-10-28T19:20:09.319661000Z",
+  "name": "empty collection",
+  "description": null,
+  "properties": {},
+  "portable_data_hash": "d41d8cd98f00b204e9800998ecf8427e+0",
+  "manifest_text": "",
+  "replication_desired": null,
+  "replication_confirmed": null,
+  "replication_confirmed_at": null,
+  "expires_at": null
+}
+</pre>
+
+h3. Get a specific record
+
+<pre>
+$ curl -v -H "Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr" https://192.168.5.2:8000/arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km | jq .
+> GET /arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km HTTP/1.1
+> User-Agent: curl/7.38.0
+> Host: 192.168.5.2:8000
+> Accept: */*
+> Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr
+>
+< HTTP/1.1 200 OK
+< Content-Type: application/json; charset=utf-8
+< Transfer-Encoding: chunked
+< Connection: keep-alive
+< Status: 200 OK
+< Access-Control-Allow-Origin: *
+< Access-Control-Allow-Methods: GET, HEAD, PUT, POST, DELETE
+< Access-Control-Allow-Headers: Authorization
+< Access-Control-Max-Age: 86486400
+< X-UA-Compatible: IE=Edge,chrome=1
+< ETag: "fec2ddf433a352e5a2b5d356abd6d3d4"
+< Cache-Control: max-age=0, private, must-revalidate
+< X-Request-Id: 40b447507ff202ae9a0b0b3e0ebe98da
+< X-Runtime: 0.011404
+< X-Powered-By: Phusion Passenger 4.0.41
+< Date: Fri, 28 Oct 2016 18:59:09 GMT
+< Server: nginx/1.4.7 + Phusion Passenger 4.0.41
+<
+{
+  "href": "/collections/962eh-4zz18-xi32mpz2621o8km",
+  "kind": "arvados#collection",
+  "etag": "3mmn0s9e1z5s5opfofmtb9k8p",
+  "uuid": "962eh-4zz18-xi32mpz2621o8km",
+  "owner_uuid": "962eh-tpzed-000000000000000",
+  "created_at": "2016-10-27T14:47:43.792587000Z",
+  "modified_by_client_uuid": "962eh-ozdt8-lm5x8emraox8epg",
+  "modified_by_user_uuid": "962eh-tpzed-000000000000000",
+  "modified_at": "2016-10-27T14:47:43.792166000Z",
+  "name": "Saved at 2016-10-27 14:47:43 UTC by peter@debian",
+  "description": null,
+  "properties": {},
+  "portable_data_hash": "93a45073511646a5c3e2f4953fcf6f61+116",
+  "manifest_text": ". eff999f3b5158331eb44a9a93e3b36e1+67108864+Aad3839bea88bce22cbfe71cf4943de7dab3ea52a@5826180f db141bfd11f7da60dce9e5ee85a988b8+34038725+Ae8f48913fed782cbe463e0499ab37697ee06a2f8@5826180f 0:101147589:rna.SRR948778.bam\n",
+  "replication_desired": null,
+  "replication_confirmed": null,
+  "replication_confirmed_at": null,
+  "expires_at": null
+}
+</pre>
+
+h3. List records and filter by date
+
+(Note, return result is truncated).
+
+<pre>
+$ curl -v -G --data-urlencode 'filters=[["created_at",">","2016-11-08T21:38:24.124834000Z"]]' -H "Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr" https://192.168.5.2:8000/arvados/v1/collections | jq .
+> GET /arvados/v1/collections?filters=%5B%5B%22uuid%22%2C%20%22%3D%22%2C%20%22962eh-4zz18-xi32mpz2621o8km%22%5D%5D HTTP/1.1
+> User-Agent: curl/7.38.0
+> Host: 192.168.5.2:8000
+> Accept: */*
+> Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr
+>
+< HTTP/1.1 200 OK
+< Content-Type: application/json; charset=utf-8
+< Transfer-Encoding: chunked
+< Connection: keep-alive
+< Status: 200 OK
+< Access-Control-Allow-Origin: *
+< Access-Control-Allow-Methods: GET, HEAD, PUT, POST, DELETE
+< Access-Control-Allow-Headers: Authorization
+< Access-Control-Max-Age: 86486400
+< X-UA-Compatible: IE=Edge,chrome=1
+< ETag: "76345ef24952f073acc3a0c550241d4e"
+< Cache-Control: max-age=0, private, must-revalidate
+< X-Request-Id: d34b8ede4ffc707d8ed172dc2f47ff5e
+< X-Runtime: 0.012727
+< X-Powered-By: Phusion Passenger 4.0.41
+< Date: Fri, 28 Oct 2016 19:08:52 GMT
+< Server: nginx/1.4.7 + Phusion Passenger 4.0.41
+<
+{
+  "kind": "arvados#collectionList",
+  "etag": "",
+  "self_link": "",
+  "offset": 0,
+  "limit": 100,
+  "items": [
+    {
+      "href": "/collections/962eh-4zz18-ybggo9im899vv60",
+      "kind": "arvados#collection",
+      "etag": "bvgrrsg63zsenb9wnpnp0nsgl",
+      "uuid": "962eh-4zz18-ybggo9im899vv60",
+      "owner_uuid": "962eh-tpzed-000000000000000",
+      "created_at": "2016-11-08T21:47:36.937106000Z",
+      "modified_by_client_uuid": null,
+      "modified_by_user_uuid": "962eh-tpzed-000000000000000",
+      "modified_at": "2016-11-08T21:47:36.936625000Z",
+      "name": "Log from cwl-runner job 962eh-8i9sb-45jww0k15fi5ldd",
+      "description": null,
+      "properties": {},
+      "portable_data_hash": "a7820b94717eff86229927565fedbd72+85",
+      "replication_desired": null,
+      "replication_confirmed": null,
+      "replication_confirmed_at": null,
+      "expires_at": null
+    },
+   ...
+    {
+      "href": "/collections/962eh-4zz18-37i1tfl5de5ild9",
+      "kind": "arvados#collection",
+      "etag": "2fa07dx52lux8wa1loehwyrc5",
+      "uuid": "962eh-4zz18-37i1tfl5de5ild9",
+      "owner_uuid": "962eh-tpzed-000000000000000",
+      "created_at": "2016-11-08T21:38:46.717798000Z",
+      "modified_by_client_uuid": null,
+      "modified_by_user_uuid": "962eh-tpzed-000000000000000",
+      "modified_at": "2016-11-08T21:38:46.717409000Z",
+      "name": null,
+      "description": null,
+      "properties": {},
+      "portable_data_hash": "9d43d4c8328640446f6e252cda584e7e+54",
+      "replication_desired": null,
+      "replication_confirmed": null,
+      "replication_confirmed_at": null,
+      "expires_at": null
+    }
+  ],
+  "items_available": 99
+}
+</pre>
+
+h3. Update a field
+
+<pre>
+$ curl -v -X PUT --data-urlencode 'collection={"name":"rna.SRR948778.bam"}' -H "Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr" https://192.168.5.2:8000/arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km | jq .
+> PUT /arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km HTTP/1.1
+> User-Agent: curl/7.38.0
+> Host: 192.168.5.2:8000
+> Accept: */*
+> Authorization: OAuth2 oz0os4nyudswvglxhdlnrgnuelxptmj7qu7dpwvyz3g9ocqtr
+> Content-Length: 53
+> Content-Type: application/x-www-form-urlencoded
+>
+} [data not shown]
+< HTTP/1.1 200 OK
+< Content-Type: application/json; charset=utf-8
+< Transfer-Encoding: chunked
+< Connection: keep-alive
+< Status: 200 OK
+< Access-Control-Allow-Origin: *
+< Access-Control-Allow-Methods: GET, HEAD, PUT, POST, DELETE
+< Access-Control-Allow-Headers: Authorization
+< Access-Control-Max-Age: 86486400
+< X-UA-Compatible: IE=Edge,chrome=1
+< ETag: "fbb50d2847426eab793e3fcf346ca9eb"
+< Cache-Control: max-age=0, private, must-revalidate
+< Set-Cookie: _server_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFVEkiJWI3NjFjMzVjMGI5OGExYmNjZDg0ZTg5MjZhMzcwMDE1BjsAVA%3D%3D--0e005d71fad15cb366e47361c38474b7447ba155; path=/; HttpOnly
+< X-Request-Id: 76d3cb3c0995af6133b0a73a64f57354
+< X-Runtime: 0.030756
+< X-Powered-By: Phusion Passenger 4.0.41
+< Date: Fri, 28 Oct 2016 19:15:16 GMT
+< Server: nginx/1.4.7 + Phusion Passenger 4.0.41
+<
+{
+  "href": "/collections/962eh-4zz18-xi32mpz2621o8km",
+  "kind": "arvados#collection",
+  "etag": "51509hhxo9qqjxqewnoz1b7og",
+  "uuid": "962eh-4zz18-xi32mpz2621o8km",
+  "owner_uuid": "962eh-tpzed-000000000000000",
+  "created_at": "2016-10-27T14:47:43.792587000Z",
+  "modified_by_client_uuid": "962eh-ozdt8-lm5x8emraox8epg",
+  "modified_by_user_uuid": "962eh-tpzed-000000000000000",
+  "modified_at": "2016-10-28T19:15:16.137814000Z",
+  "name": "rna.SRR948778.bam",
+  "description": null,
+  "properties": {},
+  "portable_data_hash": "93a45073511646a5c3e2f4953fcf6f61+116",
+  "manifest_text": ". eff999f3b5158331eb44a9a93e3b36e1+67108864+Acca57af82cc18c5dfa47bdfd16e335fccd09dfa5@582618c4 db141bfd11f7da60dce9e5ee85a988b8+34038725+A7764f122f41f92c2d5bde1852fcdd1bea5f8bd78@582618c4 0:101147589:rna.SRR948778.bam\n",
+  "replication_desired": null,
+  "replication_confirmed": null,
+  "replication_confirmed_at": null,
+  "expires_at": null
+}
+</pre>
index a93b4ac114745c2de676f2cb14ee90ac0bc60227..7b36f113bf27c7fcfe6bed44c46b96fd21c0ea48 100644 (file)
@@ -2,48 +2,38 @@
 layout: default
 navsection: api
 navmenu: Concepts
-title: Resources
+title: Common resource fields
 
 ...
 
-
-
 This page describes the common attributes of Arvados resources.
 
-The list of resource types is on the "front page of the API Reference":./.
-
-h2. Object IDs
-
-Object IDs are alphanumeric strings, unique across all installations (each installation has a unique prefix to prevent collisions).
-
-h2(#resource). Attributes of resources
+h2(#resource). Resource
 
 table(table table-bordered table-condensed).
-|*Attribute*|*Type*|*Description*|*Example*|
-|uuid|string|universally unique object identifier|@mk2qn-4zz18-w3anr2hk2wgfpuo@|
+|_. Attribute |_. Type |_. Description |_. Example|
+|uuid|string|universally unique object identifier, set on @create@|@mk2qn-4zz18-w3anr2hk2wgfpuo@|
+|owner_uuid|string|UUID of owner (must be a User or Group), set on @create@, controls who may access the resource, ownership may be changed explicitly with @update@, see "permission model":{{site.baseurl}}/api/permission-model.html for details.|@mk2qn-tpzed-a4lcehql0dv2u25@|
+|created_at|datetime|When resource was created, set on @create@|@2013-01-21T22:17:39Z@|
+|modified_by_client_uuid|string|API client software which most recently modified the resource, set on @create@ and @update@|@mk2qn-ozdt8-vq8l5qkzj7pr7h7@|
+|modified_by_user_uuid|string|Authenticated user, on whose behalf the client was acting when modifying the resource, set on @create@ and @update@|@mk2qn-tpzed-a4lcehql0dv2u25@|
+|modified_at|datetime|When resource was last modified, set on @create@ and @update@|@2013-01-25T22:29:32Z@|
 |href|string|a URL that can be used to address this resource||
 |kind|string|@arvados#{resource_type}@|@arvados#collection@|
 |etag|string|The ETag[1] of the resource|@1xlmizzjq7wro3dlb2dirf505@|
-|self_link|string|||
-|owner_uuid|string|UUID of owner (typically User or Project)|@mk2qn-tpzed-a4lcehql0dv2u25@|
-|created_at|datetime|When resource was created|@2013-01-21T22:17:39Z@|
-|modified_by_client_uuid|string|API client software which most recently modified the resource|@mk2qn-ozdt8-vq8l5qkzj7pr7h7@|
-|modified_by_user_uuid|string|Authenticated user, on whose behalf the client was acting when modifying the resource|@mk2qn-tpzed-a4lcehql0dv2u25@|
-|modified_at|datetime|When resource was last modified|@2013-01-25T22:29:32Z@|
 
-h2(#resourceList). Attributes of resource lists
+h2. Object UUID
 
-table(table table-bordered table-condensed).
-|*Attribute*|*Type*|*Description*|*Example*|
-|kind|string|@arvados#{resource_type}List@|@arvados#projectList@|
-|etag|string|The ETag[1] of the resource list|@cd3o1wi9sf934saajykawrz2e@|
-|self_link|string|||
-|next_page_token|string|||
-|next_link|string|||
-|items[]|list|List of resources||
+Each object is assigned a UUID.  This has the format @aaaaa-bbbbb-ccccccccccccccc@.
+
+# The first field (@aaaaa@ in the example) is the site prefix.  This is unique to a specific Arvados installation.
+# The second field (@bbbbb@ in the example) is the object type.
+# The third field (@ccccccccccccccc@ in the example) uniquely identifies the object.
 
+h2. Timestamps
+
+All Arvados timestamps follow ISO 8601 datetime format with fractional seconds (microsecond precision).  All timestamps are UTC.  Date format: @YYYY-mm-ddTHH:MM:SS.SSSSZ@ example date: @2016-11-08T21:38:24.124834000Z@.
 
 h2. ETags
 
 fn1. Each response includes an ETag, a string which changes when the resource changes.  Clients can use this to check whether a resource has changed since they last retrieved it.  If a previous ETag is provided along with a request, and the resource has not changed since, the server may return a "not modified" response.
-
diff --git a/doc/api/schema/ApiClient.html.textile.liquid b/doc/api/schema/ApiClient.html.textile.liquid
deleted file mode 100644 (file)
index 0cda1af..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: ApiClient
-
-...
-
-
-An **ApiClient** represents a client program that can issue requests to the API server.
-
-h2. Methods
-
-See "api_clients":{{site.baseurl}}/api/methods/api_clients.html
-
-h2. Resource
-
-Each ApiClient has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|||
-|url_prefix|string|||
-|is_trusted|boolean|Trusted by users to handle their API tokens (ApiClientAuthorizations).||
diff --git a/doc/api/schema/ApiClientAuthorization.html.textile.liquid b/doc/api/schema/ApiClientAuthorization.html.textile.liquid
deleted file mode 100644 (file)
index dc9614a..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: ApiClientAuthorization
-
-...
-
-An **ApiClientAuthorization** represents an API client's authorization to make API requests on a user's behalf.
-
-h2. Methods
-
-See "api_client_authorizations":{{site.baseurl}}/api/methods/api_client_authorizations.html
-
-h2. Resource
-
-An ApiClientAuthorization is not a generic Arvados resource.  The full list of properties that belong to an ApiClientAuthorization is:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|api_token|string|||
-|api_client_id|integer|||
-|user_id|integer|||
-|created_by_ip_address|string|||
-|last_used_by_ip_address|string|||
-|last_used_at|datetime|||
-|expires_at|datetime|||
-|default_owner_uuid|string|||
-|scopes|array|||
diff --git a/doc/api/schema/AuthorizedKey.html.textile.liquid b/doc/api/schema/AuthorizedKey.html.textile.liquid
deleted file mode 100644 (file)
index d9f4354..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: AuthorizedKey
-...
-
-An **AuthorizedKey** represents the public part of an SSH authentication key which can be used to authorize transactions on behalf of the user.
-
-h2. Methods
-
-See "authorized_keys":{{site.baseurl}}/api/methods/authorized_keys.html
-
-h2. Resource
-
-Each AuthorizedKey has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|||
-|key_type|string|||
-|authorized_user_uuid|string|||
-|public_key|text|||
-|expires_at|datetime|||
diff --git a/doc/api/schema/Collection.html.textile.liquid b/doc/api/schema/Collection.html.textile.liquid
deleted file mode 100644 (file)
index 9aa783c..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Collection
-
-...
-
-Note: This resource concerns indexing, usage accounting, and integrity checks for data stored in Arvados. Reading and writing the data _per se_ is achieved by the "Keep":{{site.baseurl}}/user/tutorials/tutorial-keep.html storage system.
-
-h2. Methods
-
-See "collections":{{site.baseurl}}/api/methods/collections.html
-
-h3. Conditions of creating a Collection
-
-The @uuid@ and @manifest_text@ attributes must be provided when creating a Collection. The cryptographic digest of the supplied @manifest_text@ must match the supplied @uuid@.
-
-h3. Side effects of creating a Collection
-
-Referenced data can be protected from garbage collection. See the section about "resources" links on the "Links":Link.html page.
-
-Data can be shared with other users via the Arvados permission model.
-
-Clients can request checks of data integrity and storage redundancy.
-
-h2. Resource
-
-Each collection has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|||
-|description|text|||
-|portable_data_hash|string|||
-|manifest_text|text|||
-|replication_desired|number|Minimum storage replication level desired for each data block referenced by this collection. A value of @null@ signifies that the site default replication level (typically 2) is desired.|@2@|
-|replication_confirmed|number|Replication level most recently confirmed by the storage system. This field is null when a collection is first created, and is reset to null when the manifest_text changes in a way that introduces a new data block. An integer value indicates the replication level of the _least replicated_ data block in the collection.|@2@, null|
-|replication_confirmed_at|datetime|When replication_confirmed was confirmed. If replication_confirmed is null, this field is also null.||
diff --git a/doc/api/schema/Container.html.textile.liquid b/doc/api/schema/Container.html.textile.liquid
deleted file mode 100644 (file)
index d29d420..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Container
-
-...
-
-A Container:
-* Precisely describes the environment in which a Crunch2 process should run. For example, git trees, data collections, and docker images are stored as content addresses. This makes it possible to reason about the difference between two processes, and to replay a process at a different time and place.
-* Container records are created by the system to fulfill container requests.
-
-h2. Methods
-
-See "containers":{{site.baseurl}}/api/methods/containers.html
-
-h2. Resource
-
-Each Container offers the following attributes, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Notes|
-|state|string|The allowed states are "Queued", "Locked", "Running", "Cancelled" and "Complete".|See "Container states":#container_states for more details.|
-|started_at|datetime|When this container started running.|Null if container has not yet started.|
-|finished_at|datetime|When this container finished.|Null if container has not yet finished.|
-|log|string|Portable data hash of the collection containing logs from a completed container run.|Null if the container is not yet finished.|
-|environment|hash|Environment variables and values that should be set in the container environment (@docker run --env@). This augments and (when conflicts exist) overrides environment variables given in the image's Dockerfile.|Must be equal to a ContainerRequest's environment in order to satisfy the ContainerRequest.|
-|cwd|string|Initial working directory.|Must be equal to a ContainerRequest's cwd in order to satisfy the ContainerRequest|
-|command|array of strings|Command to execute.| Must be equal to a ContainerRequest's command in order to satisfy the ContainerRequest.|
-|output_path|string|Path to a directory or file inside the container that should be preserved as this container's output when it finishes.|Must be equal to a ContainerRequest's output_path in order to satisfy the ContainerRequest.|
-|mounts|hash|Must contain the same keys as the ContainerRequest being satisfied. Each value must be within the range of values described in the ContainerRequest at the time the Container is assigned to the ContainerRequest.|See "Mount types":#mount_types for more details.|
-|runtime_constraints|hash|Compute resources, and access to the outside world, that are / were available to the container.
-Generally this will contain additional keys that are not present in any corresponding ContainerRequests: for example, even if no ContainerRequests specified constraints on the number of CPU cores, the number of cores actually used will be recorded here.|e.g.,
-<pre><code>{
-  "ram":12000000000,
-  "vcpus":2,
-  "API":true
-}</code></pre>See "Runtime constraints":#runtime_constraints for more details.|
-|output|string|Portable data hash of the output collection.|Null if the container is not yet finished.|
-|container_image|string|Portable data hash of a collection containing the docker image used to run the container.||
-|progress|number|A number between 0.0 and 1.0 describing the fraction of work done.||
-|priority|integer|Priority assigned by the system, taking into account the priorities of all associated ContainerRequests.||
-|exit_code|integer|Process exit code.|Null if state!="Complete"|
-|auth_uuid|string|UUID of a token to be passed into the container itself, used to access Keep-backed mounts, etc.|Null if state∉{"Locked","Running"}|
-|locked_by_uuid|string|UUID of a token, indicating which dispatch process changed state to Locked. If null, any token can be used to lock. If not null, only the indicated token can modify this container.|Null if state∉{"Locked","Running"}|
-
-h2(#container_states). Container states
-
-table(table table-bordered table-condensed).
-|_. State|_. Sgnificance|_. Allowed next|
-|Queued|Waiting for a dispatcher to lock it and try to run the container.|Locked, Cancelled|
-|Locked|A dispatcher has "taken" the container and is allocating resources for it. The container has not started yet.|Queued, Running, Cancelled|
-|Running|Resources have been allocated and the contained process has been started (or is about to start). Crunch-run _must_ set state to Running _before_ there is any possibility that user code will run in the container.|Complete, Cancelled|
-|Complete|Container was running, and the contained process/command has exited.|-|
-|Cancelled|The container did not run long enough to produce an exit code. This includes cases where the container didn't even start, cases where the container was interrupted/killed before it exited by itself (e.g., priority changed to 0), and cases where some problem prevented the system from capturing the contained process's exit status (exit code and output).|-|
-
-h2(#mount_types). {% include 'mount_types' %}
-
-h2(#runtime_constraints). {% include 'container_runtime_constraints' %}
diff --git a/doc/api/schema/ContainerRequest.html.textile.liquid b/doc/api/schema/ContainerRequest.html.textile.liquid
deleted file mode 100644 (file)
index 48c624a..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: ContainerRequest
-
-...
-
-A ContainerRequest:
-* Is a client's expression of interest in knowing the outcome of a computational process.
-* The system is responsible for finding suitable containers and assigning them to container_requests.
-* The client's description of the ContainerRequest is less precise than of a Container: a ContainerRequest describes container constraints which can have different interpretations over time. For example, a ContainerRequest with a {"kind":"git_tree","commit_range":"abc123..master",...} mount might be satisfiable by any of several different source trees, and this set of satisfying source trees can change when the repository's "master" branch is updated.
-
-h2. Methods
-
-See "container_requests":{{site.baseurl}}/api/methods/container_requests.html
-
-h2. Resource
-
-Each ContainerRequest offers the following attributes, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-All attributes are optional, unless otherwise marked as required.
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Notes|
-|name|string|The name of the container_request.||
-|description|string|The description of the container_request.||
-|properties|hash|Client-defined structured data that does not affect how the container is run.||
-|state|string|The allowed states are "Uncommitted", "Committed", and "Final".|Once a request is Committed, the only attributes that can be modified are priority, container_uuid, and container_count_max. A request in the "Final" state cannot have any of its functional parts modified (i.e., only name, description, and properties fields can be modified).|
-|requesting_container_uuid|string|The uuid of the parent container that created this container_request, if any. Represents a process tree.|The priority of this container_request is inherited from the parent container, if the parent container is cancelled, this container_request will be cancelled as well.|
-|container_uuid|string|The uuid of the container that satisfies this container_request. The system will find and reuse any preexisting Container that matches this ContainerRequest's criteria. See "Container reuse":#container_reuse for more details.|Currently, container reuse is the default behavior and a mechanism to skip reuse is not supported.|
-|container_count_max|integer|Maximum number of containers to start, i.e., the maximum number of "attempts" to be made.||
-|mounts|hash|Objects to attach to the container's filesystem and stdin/stdout.|See "Mount types":#mount_types for more details.|
-|runtime_constraints|hash|Restrict the container's access to compute resources and the outside world.|Required when in "Committed" state. e.g.,<pre><code>{
-  "ram":12000000000,
-  "vcpus":2,
-  "API":true
-}</code></pre>See "Runtime constraints":#runtime_constraints for more details.|
-|container_image|string|Portable data hash of a collection containing the docker image to run the container.|Required.|
-|environment|hash|Environment variables and values that should be set in the container environment (@docker run --env@). This augments and (when conflicts exist) overrides environment variables given in the image's Dockerfile.||
-|cwd|string|Initial working directory, given as an absolute path (in the container) or a path relative to the WORKDIR given in the image's Dockerfile.|Required.|
-|command|array of strings|Command to execute in the container.|Required. e.g., @["echo","hello"]@|
-|output_path|string|Path to a directory or file inside the container that should be preserved as container's output when it finishes. This path must be, or be inside, one of the mount targets. For best performance, point output_path to a writable collection mount.|Required.|
-|priority|integer|Higher value means spend more resources on this container_request, i.e., go ahead of other queued containers, bring up more nodes etc.|Priority 0 means a container should not be run on behalf of this request. Clients are expected to submit ContainerRequests with zero priority in order to prevew the container that will be used to satisfy it. Priority can be null if and only if state!="Committed".|
-|expires_at|datetime|After this time, priority is considered to be zero.|Not yet implemented.|
-|filters|string|Additional constraints for satisfying the container_request, given in the same form as the filters parameter accepted by the container_requests.list API.||
-
-h2(#mount_types). {% include 'mount_types' %}
-
-h2(#runtime_constraints). {% include 'container_runtime_constraints' %}
-
-h2(#container_reuse). Container reuse
-
-When a ContainerRequest is "Committed", the system will try to find and reuse any preexisting Container with the same exact command, cwd, environment, output_path, container_image, mounts, and runtime_constraints as this ContainerRequest. The serialized fields environment, mounts and runtime_constraints are sorted to facilitate comparison.
-
-The system will use the following scheme to determine which Container to consider for reuse: A Container with the same exact command, cwd, environment, output_path, container_image, mounts, and runtime_constraints as this ContainerRequest and,
-* The oldest successfully finished container, i.e., in state "Complete" with exit_code of 0. If matching containers with different outputs are found, the system will forgo reusing any of these finished containers and instead look for suitable containers in other states
-* The oldest "Running" container with the highest progress, i.e., the container that is most likely to finish first
-* The oldest "Locked" container with the highest priority, i.e., the container that is most likely to start first
-* The oldest "Queued" container with the highest priority, i.e, the container that is most likely to start first
-
-{% include 'notebox_begin' %}
-Currently, container reuse is the default behavior and a mechanism to skip reuse is not supported.
-{% include 'notebox_end' %}
-
-h2(#cancel_container). Canceling a ContainerRequest
-
-A ContainerRequest may be canceled by setting it's priority to 0, using an update call.
-
-When a ContainerRequest is canceled, it will still reflect the state of the Container it is associated with via the container_uuid attribute. If that Container is being reused by any other container_requests that are still active, i.e., not yet canceled, that Container may continue to run or be scheduled to run by the system in future. However, if no other container_requests are using that Contianer, then the Container will get canceled as well.
diff --git a/doc/api/schema/Group.html.textile.liquid b/doc/api/schema/Group.html.textile.liquid
deleted file mode 100644 (file)
index 2bf67eb..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Group
-
-...
-
-A **Group** represents a set of objects. Groups allow you to organize content, define user roles, and apply permissions to sets of objects.
-
-h2. Methods
-
-See "groups":{{site.baseurl}}/api/methods/groups.html
-
-h2. Resource
-
-Each Group has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|||
-|group_class|string|Type of group. This does not affect behavior, but determines how the group is presented in the user interface. For example, @project@ indicates that the group should be displayed by Workbench and arv-mount as a project for organizing and naming objects.|@"project"@
-null|
-|description|text|||
-|writable_by|array|List of UUID strings identifying Users and other Groups that have write permission for this Group.  Only users who are allowed to administer the Group will receive a full list.  Other users will receive a partial list that includes the Group's owner_uuid and (if applicable) their own user UUID.||
diff --git a/doc/api/schema/Human.html.textile.liquid b/doc/api/schema/Human.html.textile.liquid
deleted file mode 100644 (file)
index 361e619..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Human
-
-...
-
-h2. Methods
-
-See "humans":{{site.baseurl}}/api/methods/humans.html
-
-h2. Resource
-
-Each Human has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|properties|hash|||
diff --git a/doc/api/schema/Job.html.textile.liquid b/doc/api/schema/Job.html.textile.liquid
deleted file mode 100644 (file)
index 58b6a51..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Job
-
-...
-
-Applications submit compute jobs when:
-* Provenance is important, i.e., it is worth recording how the output was produced; or
-* Computation time is significant; or
-* The job management features are convenient (failure detection/recovery, regression testing, etc).
-
-h2. Methods
-
-See "jobs":{{site.baseurl}}/api/methods/jobs.html
-
-h2. Resource
-
-Each job has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Notes|
-|script|string|The filename of the job script.|This program will be invoked by Crunch for each job task. It is given as a path to an executable file, relative to the @/crunch_scripts@ directory in the Git tree specified by the _repository_ and _script_version_ attributes.|
-|script_parameters|hash|The input parameters for the job.|Conventionally, one of the parameters is called @"input"@. Typically, some parameter values are collection UUIDs. Ultimately, though, the significance of parameters is left entirely up to the script itself.|
-|repository|string|Git repository name or URL.|Source of the repository where the given script_version is to be found. This can be given as the name of a locally hosted repository, or as a publicly accessible URL starting with @git://@, @http://@, or @https://@.
-Examples:
-@yourusername/yourrepo@
-@https://github.com/curoverse/arvados.git@|
-|script_version|string|Git commit|During a **create** transaction, this is the Git branch, tag, or hash supplied by the client. Before the job starts, Arvados updates it to the full 40-character SHA-1 hash of the commit used by the job.
-See "Specifying Git versions":#script_version below for more detail about acceptable ways to specify a commit.|
-|cancelled_by_client_uuid|string|API client ID|Is null if job has not been cancelled|
-|cancelled_by_user_uuid|string|Authenticated user ID|Is null if job has not been cancelled|
-|cancelled_at|datetime|When job was cancelled|Is null if job has not been cancelled|
-|started_at|datetime|When job started running|Is null if job has not [yet] started|
-|finished_at|datetime|When job finished running|Is null if job has not [yet] finished|
-|running|boolean|Whether the job is running||
-|success|boolean|Whether the job indicated successful completion|Is null if job has not finished|
-|is_locked_by_uuid|string|UUID of the user who has locked this job|Is null if job is not locked. The system user locks the job when starting the job, in order to prevent job attributes from being altered.|
-|node_uuids|array|List of UUID strings for node objects that have been assigned to this job||
-|log|string|Collection UUID|Is null if the job has not finished. After the job runs, the given collection contains a text file with log messages provided by the @arv-crunch-job@ task scheduler as well as the standard error streams provided by the task processes.|
-|tasks_summary|hash|Summary of task completion states.|Example: @{"done":0,"running":4,"todo":2,"failed":0}@|
-|output|string|Collection UUID|Is null if the job has not finished.|
-|nondeterministic|boolean|The job is expected to produce different results if run more than once.|If true, this job will not be considered as a candidate for automatic re-use when submitting subsequent identical jobs.|
-|submit_id|string|Unique ID provided by client when job was submitted|Optional. This can be used by a client to make the "jobs.create":{{site.baseurl}}/api/methods/jobs.html#create method idempotent.|
-|priority|string|||
-|arvados_sdk_version|string|Git commit hash that specifies the SDK version to use from the Arvados repository|This is set by searching the Arvados repository for a match for the arvados_sdk_version runtime constraint.|
-|docker_image_locator|string|Portable data hash of the collection that contains the Docker image to use|This is set by searching readable collections for a match for the docker_image runtime constraint.|
-|runtime_constraints|hash|Constraints that must be satisfied by the job/task scheduler in order to run the job.|See below.|
-|components|hash|Name and uuid pairs representing the child work units of this job. The uuids can be of different object types.|Example components hash: @{"name1": "zzzzz-8i9sb-xyz...", "name2": "zzzzz-d1hrv-xyz...",}@|
-
-h3(#script_version). Specifying Git versions
-
-The script_version attribute and arvados_sdk_version runtime constraint are typically given as a branch, tag, or commit hash, but there are many more ways to specify a Git commit. The "specifying revisions" section of the "gitrevisions manual page":http://git-scm.com/docs/gitrevisions.html has a definitive list. Arvados accepts Git versions in any format listed there that names a single commit (not a tree, a blob, or a range of commits). However, some kinds of names can be expected to resolve differently in Arvados than they do in your local repository. For example, <code>HEAD@{1}</code> refers to the local reflog, and @origin/master@ typically refers to a remote branch: neither is likely to work as desired if given as a Git version.
-
-h3. Runtime constraints
-
-table(table table-bordered table-condensed).
-|_. Key|_. Type|_. Description|_. Implemented|
-|arvados_sdk_version|string|The Git version of the SDKs to use from the Arvados git repository.  See "Specifying Git versions":#script_version for more detail about acceptable ways to specify a commit.  If you use this, you must also specify a @docker_image@ constraint (see below).  In order to install the Python SDK successfully, Crunch must be able to find and run virtualenv inside the container.|&#10003;|
-|docker_image|string|The Docker image that this Job needs to run.  If specified, Crunch will create a Docker container from this image, and run the Job's script inside that.  The Keep mount and work directories will be available as volumes inside this container.  The image must be uploaded to Arvados using @arv keep docker@.  You may specify the image in any format that Docker accepts, such as @arvados/jobs@, @debian:latest@, or the Docker image id.  Alternatively, you may specify the portable data hash of the image Collection.|&#10003;|
-|min_nodes|integer||&#10003;|
-|max_nodes|integer|||
-|min_cores_per_node|integer|Require that each node assigned to this Job have the specified number of CPU cores|&#10003;|
-|min_ram_mb_per_node|integer|Require that each node assigned to this Job have the specified amount of real memory (in MiB)|&#10003;|
-|min_scratch_mb_per_node|integer|Require that each node assigned to this Job have the specified amount of scratch storage available (in MiB)|&#10003;|
-|max_tasks_per_node|integer|Maximum simultaneous tasks on a single node|&#10003;|
-|keep_cache_mb_per_task|integer|Size of file data buffer for per-task Keep directory ($TASK_KEEPMOUNT), in MiB.  Default is 256 MiB.  Increase this to reduce cache thrashing in situtations such as accessing multiple large (64+ MiB) files at the same time, or accessing different parts of a large file at the same time.|&#10003;|
-|min_ram_per_task|integer|Minimum real memory (KiB) per task||
diff --git a/doc/api/schema/JobTask.html.textile.liquid b/doc/api/schema/JobTask.html.textile.liquid
deleted file mode 100644 (file)
index fbd4343..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: JobTask
-
-...
-
-A Job Task is a well defined independently-computable portion of a "Job":Job.html.
-
-Job tasks are created two ways:
-* When a job starts, it is seeded with a job task with @sequence=0@ and an empty @parameters{}@ list.
-* Job task A can create additional job tasks B, C, D, which will belong to the same job. Tasks B, C, D will not be performed until job task A is complete. If job task A fails, tasks B, C, D will be deleted.
-
-Job tasks have particular update semantics:
-* Progress reporting: A job task should only be <code>PATCH</code>ed by a worker process which has been dispatched to work on that task and is reporting progress or completion status &mdash; and by the job manager itself.
-* Completion: When a job task process terminates, the task is considered complete only if its most recent @PATCH@ transaction had @progress=1.0@ and @success=true@.
-* Temporary failure: If a job task process terminates without updating @success@ to @true@ or @false@, it is assumed that the task failed but is worth re-attempting (at a different time, on a different node, etc).
-
-
-h2. Methods
-
-See "job_tasks":{{site.baseurl}}/api/methods/job_tasks.html
-
-h2. Resource
-
-Each JobTask has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|sequence|integer|Execution sequence.
-A step cannot be run until all steps with lower sequence numbers have completed.
-Job steps with the same sequence number can be run in any order.||
-|parameters|hash|||
-|output|text|||
-|progress|float|||
-|success|boolean|Is null if the task has neither completed successfully nor failed permanently.||
-
-The following attributes should not be updated by anyone other than the job manager:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Notes|
-|qsequence|integer|Order of arrival|0-based|
-|job_uuid|string|||
-|created_by_job_task_uuid|string|||
-
-
diff --git a/doc/api/schema/KeepDisk.html.textile.liquid b/doc/api/schema/KeepDisk.html.textile.liquid
deleted file mode 100644 (file)
index c128c3e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: KeepDisk
-
-...
-
-A **KeepDisk** is a filesystem volume used by a Keep storage server to store data blocks.
-
-h2. Methods
-
-See "keep_disks":{{site.baseurl}}/api/methods/keep_disks.html
-
-h2. Resource
-
-Each KeepDisk has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|ping_secret|string|||
-|node_uuid|string|||
-|filesystem_uuid|string|||
-|bytes_total|integer|||
-|bytes_free|integer|||
-|is_readable|boolean|||
-|is_writable|boolean|||
-|last_read_at|datetime|||
-|last_write_at|datetime|||
-|last_ping_at|datetime|||
-|keep_service_uuid|string|||
diff --git a/doc/api/schema/KeepService.html.textile.liquid b/doc/api/schema/KeepService.html.textile.liquid
deleted file mode 100644 (file)
index ac1d974..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: KeepService
-
-...
-
-A **KeepService** is a service endpoint that supports the Keep protocol.
-
-h2. Methods
-
-See "keep_services":{{site.baseurl}}/api/methods/keep_services.html
-
-h2. Resource
-
-Each KeepService has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|service_host|string|||
-|service_port|integer|||
-|service_ssl_flag|boolean|||
-|service_type|string|||
\ No newline at end of file
diff --git a/doc/api/schema/Link.html.textile.liquid b/doc/api/schema/Link.html.textile.liquid
deleted file mode 100644 (file)
index 4abfdbc..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Link
-
-...
-
-**Links** describe relationships between Arvados objects, and from objects to primitives.
-
-Links are directional: each metadata object has a tail (the "subject" being described), class, name, properties, and head (the "object" that describes the "subject").  A Link may describe a relationship between two objects in an Arvados database: e.g. a _permission_ link between a User and a Group defines the permissions that User has to read or modify the Group.  Other Links simply represent metadata for a single object, e.g. the _identifier_ Link, in which the _name_ property represents a human-readable identifier for the object at the link's head.
-
-For links that don't make sense to share between API clients, a _link_class_ that begins with @client@ (like @client.my_app_id@ or @client.my_app_id.anythinghere@) should be used.
-
-h2. Methods
-
-See "links":{{site.baseurl}}/api/methods/links.html
-
-h2. Resource
-
-Each link has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|
-|tail_uuid|string|Object UUID at the tail (start, source, origin) of this link|
-|link_class|string|Class (see below)|
-|name|string|Link type (see below)|
-|head_uuid|string|Object UUID at the head (end, destination, target) of this link|
-|properties|hash|Additional information, expressed as a key&rarr;value hash. Key: string. Value: string, number, array, or hash.|
-
-h2. Link classes
-
-Some classes are pre-defined by convention and have standard meanings attached to names.
-
-h3. provenance
-
-table(table table-bordered table-condensed).
-|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|_. Notes|
-|&rarr;Collection  |provided &rarr; _collection uuid_
-{url&rarr;http://example.com/foo.tgz, retrieved_at&rarr;1352616640.000}||
-|Job&rarr;Collection     |provided &rarr; _collection uuid_||
-|Specimen&rarr;Collection|provided &rarr; _collection uuid_||
-|Human&rarr;Specimen     |provided &rarr; _specimen uuid_||
-|Human&rarr;Collection   |provided &rarr; _collection uuid_||
-
-h3. permission
-
-table(table table-bordered table-condensed).
-|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|_. Notes|
-|User&rarr;Group  |{white-space:nowrap}. can_manage &rarr; _group uuid_|The User can read, write, and control permissions on the Group itself, every object owned by the Group, and every object on which the Group has _can_manage_ permission.|
-|User&rarr;Group  |can_read &rarr; _group uuid_  |The User can retrieve the Group itself and every object that is readable by the Group.|
-|User&rarr;Job|can_write &rarr; _job uuid_  |The User can read and update the Job. (This works for all objects, not just jobs.)|
-|User&rarr;Job|can_manage &rarr; _job uuid_  |The User can read, update, and change permissions for the Job. (This works for all objects, not just jobs.)|
-|Group&rarr;Job|can_manage &rarr; _job uuid_  |Anyone with _can_manage_ permission on the Group can also read, update, and change permissions for the Job. Anyone with _can_read_ permission on the Group can read the Job. (This works for all objects, not just jobs.)|
-
-h3. resources
-
-table(table table-bordered table-condensed).
-|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|_. Notes|
-|User&rarr;Collection|wants &rarr; _collection uuid_    |Determines whether data can be deleted|
-|User&rarr;Job       |wants &rarr; _job uuid_    |Determines whether a job can be cancelled|
-
-h3. tag
-
-A **tag** link describes an object using an unparsed plain text string. Tags can be used to annotate objects that are not editable, like collections and objects shared as read-only.
-
-table(table table-bordered table-condensed).
-|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|
-|&rarr;Collection           | _tag name_ &rarr; _collection uuid_|
-|&rarr;Job                  | _tag name_ &rarr; _job uuid_|
-
-h3. human_trait
-
-table(table table-bordered table-condensed).
-|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|_. Notes|
-|Human&rarr;Trait  |measured &rarr; _trait uuid_ {value&rarr;1.83, unit&rarr;metre, measured_at&rarr;1352616640.000}||
-
-h3. identifier
-
-table(table table-bordered table-condensed).
-|_. tail_type&rarr;head_type|_. name&rarr;head_uuid {properties}|_. Notes|
-|&rarr;Human        |hu123456 &rarr; _human uuid_||
-
diff --git a/doc/api/schema/Log.html.textile.liquid b/doc/api/schema/Log.html.textile.liquid
deleted file mode 100644 (file)
index 425246a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Log
-
-...
-
-**Log** objects record events that occur in an Arvados cluster. Both user-written pipelines and the Arvados system itself may generate Log events.
-
-h2. Methods
-
-See "logs":{{site.baseurl}}/api/methods/logs.html
-
-h2. Creation
-
-Any user may create Log entries for any event they find useful. User-generated Logs have no intrinsic meaning to other users or to the Arvados system itself; it is up to each user to choose appropriate log event types and summaries for their project.
-
-h3. System Logs
-
-Arvados uses Logs to record creation, deletion, and updates of other Arvados resources.
-
-h2. Resource
-
-Each Log has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|object_uuid|string|||
-|event_at|datetime|||
-|event_type|string|A user-defined category or type for this event.|@LOGIN@|
-|summary|text|||
-|properties|hash|||
diff --git a/doc/api/schema/Node.html.textile.liquid b/doc/api/schema/Node.html.textile.liquid
deleted file mode 100644 (file)
index ff9e882..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Node
-
-...
-
-A **Node** represents a host that can be used to run Crunch job tasks.
-
-h2. Methods
-
-See "nodes":{{site.baseurl}}/api/methods/nodes.html
-
-h2. Resource
-
-Each Node has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|slot_number|integer|||
-|hostname|string|||
-|domain|string|||
-|ip_address|string|||
-|job_uuid|string|The UUID of the job that this node is assigned to work on.  If you do not have permission to read the job, this will be null.||
-|first_ping_at|datetime|||
-|last_ping_at|datetime|||
-|info|hash|||
diff --git a/doc/api/schema/PipelineInstance.html.textile.liquid b/doc/api/schema/PipelineInstance.html.textile.liquid
deleted file mode 100644 (file)
index 75c7885..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: PipelineInstance
-
-...
-
-A **PipelineInstance** is the act or record of applying a pipeline template to a specific set of inputs; generally, a pipeline instance refers to a set of jobs that have been run to satisfy the pipeline components.
-
-h2. Methods
-
-See "pipeline_instances":{{site.baseurl}}/api/methods/pipeline_instances.html
-
-h2. Resource
-
-Each PipelineInstance has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|pipeline_template_uuid|string|||
-|name|string|||
-|components|hash|||
-|success|boolean|||
-|active|boolean|||
-|properties|Hash|||
diff --git a/doc/api/schema/PipelineTemplate.html.textile.liquid b/doc/api/schema/PipelineTemplate.html.textile.liquid
deleted file mode 100644 (file)
index 444960a..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: PipelineTemplate
-...
-
-The pipeline template consists of "name" and "components".
-
-table(table table-bordered table-condensed).
-|_. Attribute    |_. Type |_. Accepted values                           |_. Required|_. Description|
-|name            |string  |any                                          |yes        |The human-readable name of the pipeline template.|
-|components      |object  |JSON object containing job submission objects|yes        |The component jobs that make up the pipeline, with the component name as the key. |
-
-h3. Components
-
-The components field of the pipeline template is a JSON object which describes the individual steps that make up the pipeline.  Each component is an Arvados job submission.  "Parameters for job submissions are described on the job method page.":{{site.baseurl}}/api/methods/jobs.html#create  In addition, a component can have the following parameters:
-
-table(table table-bordered table-condensed).
-|_. Attribute    |_. Type          |_. Accepted values |_. Required|_. Description|
-|output_name     |string or boolean|string or false    |no         |If a string is provided, use this name for the output collection of this component.  If the value is false, do not create a permanent output collection (an temporary intermediate collection will still be created).  If not provided, a default name will be assigned to the output.|
-
-h3. Script parameters
-
-When used in a pipeline, each parameter in the 'script_parameters' attribute of a component job can specify that the input parameter must be supplied by the user, or the input parameter should be linked to the output of another component.  To do this, the value of the parameter should be JSON object containing one of the following attributes:
-
-table(table table-bordered table-condensed).
-|_. Attribute    |_. Type |_. Accepted values                               |_. Description|
-|default         |any     |any                                              |The default value for this parameter.|
-|required        |boolean |true or false                                    |Specifies whether the parameter is required to have a value or not.|
-|dataclass       |string  |One of 'Collection', 'File' [1], 'number', or 'text' |Data type of this parameter.|
-|search_for      |string  |any string                                       |Substring to use as a default search string when choosing inputs.|
-|output_of       |string  |the name of another component in the pipeline    |Specifies that the value of this parameter should be set to the 'output' attribute of the job that corresponds to the specified component.|
-|title           |string  |any string                                       |User friendly title to display when choosing parameter values|
-|description     |string  |any string                                       |Extended text description for describing expected/valid values for the script parameter|
-|link_name       |string  |any string                                       |User friendly name to display for the parameter value instead of the actual parameter value|
-
-The 'output_of' parameter is especially important, as this is how components are actually linked together to form a pipeline.  Component jobs that depend on the output of other components do not run until the parent job completes and has produced output.  If the parent job fails, the entire pipeline fails.
-
-fn1. The 'File' type refers to a specific file within a Keep collection in the form 'collection_hash/filename', for example '887cd41e9c613463eab2f0d885c6dd96+83/bob.txt'.
-
-The 'search_for' parameter is meaningful only when input dataclass of type Collection or File is used. If a value is provided, this will be preloaded into the input data chooser dialog in Workbench. For example, if your input dataclass is a File and you are interested in a certain filename extention, you can preconfigure it in this attribute.
-
-h3. Examples
-
-This is a pipeline named "Filter MD5 hash values" with two components, "do_hash" and "filter".  The "input" script parameter of the "do_hash" component is required to be filled in by the user, and the expected data type is "Collection".  This also specifies that the "input" script parameter of the "filter" component is the output of "do_hash", so "filter" will not run until "do_hash" completes successfully.  When the pipeline runs, past jobs that meet the criteria described above may be substituted for either or both components to avoid redundant computation.
-
-<notextile><pre>
-{
-  "name": "Filter MD5 hash values",
-  "components": {
-    "do_hash": {
-      "script": "hash.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": {
-        "input": {
-          "required": true,
-          "dataclass": "Collection",
-          "search_for": ".fastq.gz",
-          "title":"Please select a fastq file"
-        }
-      },
-    },
-    "filter": {
-      "script": "0-filter.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": {
-        "input": {
-          "output_of": "do_hash"
-        }
-      },
-    }
-  }
-}
-</pre></notextile>
-
-This pipeline consists of three components.  The components "thing1" and "thing2" both depend on "cat_in_the_hat".  Once the "cat_in_the_hat" job is complete, both "thing1" and "thing2" can run in parallel, because they do not depend on each other.
-
-<notextile><pre>
-{
-  "name": "Wreck the house",
-  "components": {
-    "cat_in_the_hat": {
-      "script": "cat.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": { }
-    },
-    "thing1": {
-      "script": "thing1.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": {
-        "input": {
-          "output_of": "cat_in_the_hat"
-        }
-      },
-    },
-    "thing2": {
-      "script": "thing2.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": {
-        "input": {
-          "output_of": "cat_in_the_hat"
-        }
-      },
-    },
-  }
-}
-</pre></notextile>
-
-This pipeline consists of three components.  The component "cleanup" depends on "thing1" and "thing2".  Both "thing1" and "thing2" are started immediately and can run in parallel, because they do not depend on each other, but "cleanup" cannot begin until both "thing1" and "thing2" have completed.
-
-<notextile><pre>
-{
-  "name": "Clean the house",
-  "components": {
-    "thing1": {
-      "script": "thing1.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": { }
-    },
-    "thing2": {
-      "script": "thing2.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": { }
-    },
-    "cleanup": {
-      "script": "cleanup.py",
-      "repository": "<b>you</b>/<b>you</b>",
-      "script_version": "master",
-      "script_parameters": {
-        "mess1": {
-          "output_of": "thing1"
-        },
-        "mess2": {
-          "output_of": "thing2"
-        }
-      }
-    }
-  }
-}
-</pre></notextile>
-
-h2. Methods
-
-See "pipeline_templates":{{site.baseurl}}/api/methods/pipeline_templates.html
-
-h2. Resource
-
-Each PipelineTemplate has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|||
-|components|hash|||
diff --git a/doc/api/schema/Repository.html.textile.liquid b/doc/api/schema/Repository.html.textile.liquid
deleted file mode 100644 (file)
index 0f9b25e..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Repository
-
-...
-
-A **Repository** represents a git repository hosted in an Arvados installation.
-
-h2. Methods
-
-See "repositories":{{site.baseurl}}/api/methods/repositories.html
-
-h2. Resource
-
-Each Repository has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|The name of the repository on disk.  Repository names must begin with a letter and contain only alphanumerics.  Unless the repository is owned by the system user, the name must begin with the owner's username, then be separated from the base repository name with @/@.  You may not create a repository that is owned by a user without a username.|@username/project1@|
-|clone_urls|array|URLs from which the repository can be cloned. Read-only.|@["git@git.zzzzz.arvadosapi.com:foo/bar.git",
- "https://git.zzzzz.arvadosapi.com/foo/bar.git"]@|
-|fetch_url|string|URL suggested as a fetch-url in git config. Deprecated. Read-only.||
-|push_url|string|URL suggested as a push-url in git config. Deprecated. Read-only.||
diff --git a/doc/api/schema/Specimen.html.textile.liquid b/doc/api/schema/Specimen.html.textile.liquid
deleted file mode 100644 (file)
index 1a7e483..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Specimen
-
-...
-
-A **Specimen** represents a tissue sample or similar material obtained from a human that has some biomedical significance or interest.
-
-h2. Methods
-
-See "specimens":{{site.baseurl}}/api/methods/specimens.html
-
-h2. Resource
-
-Each Specimen has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|material|string|||
-|properties|hash|||
diff --git a/doc/api/schema/Trait.html.textile.liquid b/doc/api/schema/Trait.html.textile.liquid
deleted file mode 100644 (file)
index 80c74ab..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Trait
-
-...
-
-A **Trait** represents a measured or observed characteristic of a human.
-
-h2. Methods
-
-See "traits":{{site.baseurl}}/api/methods/traits.html
-
-h2. Resource
-
-Each Trait has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|||
-|properties|hash|||
diff --git a/doc/api/schema/User.html.textile.liquid b/doc/api/schema/User.html.textile.liquid
deleted file mode 100644 (file)
index 335b6c1..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: User
-
-...
-
-A **User** represents a person who interacts with Arvados via an ApiClient.
-
-h2. Methods
-
-See "users":{{site.baseurl}}/api/methods/users.html
-
-h2. Resource
-
-Each User has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|email|string|||
-|username|string|The username used for the user's git repositories and virtual machine logins.  Usernames must start with a letter, and contain only alphanumerics.  When a new user is created, a default username is set from their e-mail address.  Only administrators may change the username.||
-|first_name|string|||
-|last_name|string|||
-|identity_url|string|||
-|is_admin|boolean|||
-|prefs|hash|||
-|default_owner_uuid|string|||
-|is_active|boolean|||
-|writable_by|array|List of UUID strings identifying Groups and other Users that can modify this User object.  This will include the user's owner_uuid and, for administrators and users requesting their own User object, the requesting user's UUID.||
diff --git a/doc/api/schema/VirtualMachine.html.textile.liquid b/doc/api/schema/VirtualMachine.html.textile.liquid
deleted file mode 100644 (file)
index 1c6a4b6..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: VirtualMachine
-
-...
-
-A **VirtualMachine** represents a network host, running within an Arvados installation, on which Arvados users are given login accounts.
-
-h2. Methods
-
-See "virtual_machines":{{site.baseurl}}/api/methods/virtual_machines.html
-
-h2. Resource
-
-Each VirtualMachine has, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|hostname|string|||
diff --git a/doc/api/schema/Workflow.html.textile.liquid b/doc/api/schema/Workflow.html.textile.liquid
deleted file mode 100644 (file)
index 05cd998..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
----
-layout: default
-navsection: api
-navmenu: Schema
-title: Workflow
-
-...
-
-A *Workflow* is a definition of work to be performed by a Crunch2 process. It defines the steps and inputs for the process.
-
-h2. Methods
-
-See "workflows":{{site.baseurl}}/api/methods/workflows.html
-
-h2. Resource
-
-Each Workflow offers the following optional attributes, in addition to the usual "attributes of Arvados resources":{{site.baseurl}}/api/resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-|name|string|If not specified, will be set to any "name" from the "definition" attribute.||
-|description|string|If not specified, will be set to any "description" from the "definition" attribute.||
-|definition|string|A "Common Workflow Language" document.|Visit "Common Workflow Language":http://www.commonwl.org/ for details.|
diff --git a/doc/api/storage.html.textile.liquid b/doc/api/storage.html.textile.liquid
new file mode 100644 (file)
index 0000000..868e5cc
--- /dev/null
@@ -0,0 +1,170 @@
+---
+layout: default
+navsection: api
+title: Storage in Keep
+...
+
+Keep clients are applications such as @arv-get@, @arv-put@ and @arv-mount@ which store and retrieve data from Keep.  In doing so, these programs interact with both the API server (which stores file metadata in form of Collection objects) and individual Keep servers (which store the actual data blocks).
+
+!{{site.baseurl}}/images/Keep_reading_writing_block.svg!
+
+h2. Storing a file
+
+# The client discovers keep servers (or proxies) using the @accessible@ method on "keep_services":{{site.baseurl}}/api/methods/keep_services.html
+# Data is split into 64 MiB blocks and the MD5 hash is computed for each block.
+# The client uploads each block to one or more Keep servers, based on the number of desired replicas.  The priority order is determined using rendezvous hashing, described below.
+# The Keep server returns a block locator (the MD5 sum of the block) and a "signed token" which the client can use as proof of knowledge for the block.
+# The client constructs a @manifest@ which lists the blocks by MD5 hash and how to reassemble them into the original files.
+# The client creates a "collection":{{site.baseurl}}/api/methods/collections.html and provides the @manifest_text@
+# The API server accepts the collection after validating the signed tokens (proof of knowledge) for each block.
+
+!{{site.baseurl}}/images/Keep_manifests.svg!
+
+h2. Fetching a file
+
+# The client requests a @collection@ object including @manifest_text@ from the APIs server
+# The server adds "token signatures" to the @manifest_text@ and returns it to the client.
+# The client discovers keep servers (or proxies) using the @accessible@ method on "keep_services":{{site.baseurl}}/api/methods/keep_services.html
+# For each data block, the client chooses the highest priority server using rendezvous hashing, described below.
+# The client sends the data block request to the keep server, along with the token signature from the API which proves to Keep servers that the client is permitted to read a given block.
+# The server provides the block data after validating the token signature for the block (if the server does not have the block, it returns a 404 and the client tries the next highest priority server)
+
+!{{site.baseurl}}/images/Keep_rendezvous_hashing.svg!
+
+Each @keep_service@ resource has an assigned uuid.  To determine priority assignments of blocks to servers, for each keep service compute the MD5 sum of the string concatenation of the block locator (hex-coded hash part only) and service uuid, then sort this list in descending order.  Blocks are preferentially placed on servers with the highest weight.
+
+h2. Keep server API
+
+The Keep server is accessed via a simple HTTP REST API.
+
+*GET /blocklocator+size+A@token*
+
+Fetch the data block.  Response returns block contents.  If permission checking is enabled, requires a valid token hint.
+
+*PUT /blocklocator*
+
+Body: the block contents.  Responds the block locator consisting of MD5 sum of the data, block size, and signed token hint.
+
+*POST /*
+
+Body: the block contents.  Responds the block locator consisting of MD5 sum of the data, block size, and signed token hint.
+
+h2(#locator). Keep locator format
+
+BNF notation for a valid Keep locator string (with hints).  For example @d41d8cd98f00b204e9800998ecf8427e+0+Z+Ada39a3ee5e6b4b0d3255bfef95601890afd80709@53bed294@
+
+<pre>
+locator        ::= sized-digest hint*
+sized-digest   ::= digest size-hint
+digest         ::= <32 lowercase hexadecimal digits>
+size-hint      ::= "+" [0-9]+
+hint           ::= "+" hint-type hint-content
+hint-type      ::= [A-Z]+
+hint-content   ::= [A-Za-z0-9@_-]*
+sign-hint      ::= "+A" <40 lowercase hexadecimal digits> "@" sign-timestamp
+sign-timestamp ::= <8 lowercase hexadecimal digits>
+</pre>
+
+h3. Token signatures
+
+A token signature (sign-hint) provides proof-of-access for a data block.  It is computed by taking a SHA1 HMAC of the blob signing token (a shared secret between the API server and keep servers), block digest, current API token, expiration timestamp, and blob signature TTL.
+
+When communicating with the Keep store to fetch a block, or the API server to create or update a collection, the service computes the expected token signature for each block and compares it to the token signature that was presented by the client.  Keep clients receive valid block signatures when uploading a block to a keep store (getting back a signed token as proof of knowledge) or, from the API server, getting the manifest text of a collection on which the user has read permission.
+
+Security of a token signature is derived from the following characteristics:
+
+# Valid signatures can only be generated by entities that know the shared secret (the "blob signing token")
+# A signature can only be used by an entity that also know the API token that was used to generate it.
+# It expires after a set date (the expiration time, based on the "blob signature time-to-live (TTL)")
+
+h3. Regular expression to validate locator
+
+<pre>
+/^([0-9a-f]{32})\+([0-9]+)(\+[A-Z][-A-Za-z0-9@_]*)*$/
+</pre>
+
+h3. Valid locators
+
+table(table table-bordered table-condensed).
+|@d41d8cd98f00b204e9800998ecf8427e+0@|
+|@d41d8cd98f00b204e9800998ecf8427e+0+Z@|
+|<code>d41d8cd98f00b204e9800998ecf8427e+0+Z+Ada39a3ee5e6b4b0d3255bfef95601890afd80709@53bed294</code>|
+
+h3. Invalid locators
+
+table(table table-bordered table-condensed).
+||Why|
+|@d41d8cd98f00b204e9800998ecf8427e@|No size hint|
+|@d41d8cd98f00b204e9800998ecf8427e+Z+0@|Other hint before size hint|
+|@d41d8cd98f00b204e9800998ecf8427e+0+0@|Multiple size hints|
+|@d41d8cd98f00b204e9800998ecf8427e+0+z@|Hint does not start with uppercase letter|
+|@d41d8cd98f00b204e9800998ecf8427e+0+Zfoo*bar@|Hint contains invalid character @*@|
+
+h2. Manifest v1
+
+A manifest is utf-8 encoded text, consisting of zero or more newline-terminated streams.
+
+<pre>
+manifest       ::= stream*
+stream         ::= stream-name (" " locator)+ (" " file-segment)+ "\n"
+stream-name    ::= "." ("/" path-component)*
+path-component ::= <printable ASCII - (whitespace, "/")>+
+file-segment   ::= position ":" size ":" filename
+position       ::= [0-9]+
+size           ::= [0-9]+
+filename       ::= path-component ("/" path-component)*
+</pre>
+
+Notes:
+
+* The first token is the stream name, consisting of one or more path components, delimited by @"/"@.
+** The first path component is always @"."@.
+** No path component is empty.
+** No path component following the first one can be "." or "..".
+** The stream name never begins or ends with @"/"@.
+* The next N tokens are "keep locators":#locator
+** These describe the "data stream".  By logically concatenating the blocks in the order that they appear, we can refer to "positions" in the data stream.
+* File tokens come after the sequence of keep locators.
+** A file token has three parts, delimited by @":"@: position, size, filename.
+** Position and size are given in decimal
+** The position is the position in the data stream
+** The size is the count of bytes following the position in the data stream.  A file size may cross multiple blocks in the data stream.
+** Filename may contain @"/"@ characters, but must not start or end with @"/"@, and must not contain @"//"@.
+** Filename components (delimited by @"/"@) must not be @"."@ or @".."@.
+** There may be multiple file tokens.
+
+It is legal to have multiple file tokens in the manifest (possible across different streams) with the same combined path name @stream name + "/" + filename@.  This must be interpreted as a concatenation of file content, in the order that the file tokens appear in the manifest.
+
+Spaces are represented by the escape sequence @\040@.  Spaces in stream names and filenames must be translated when reading and writing manifests.  A manifest may not contain TAB characters, nor other ASCII whitespace characters or control codes other than the spaces or newlines used as delimiters specified above.  A manifest always ends with a newline -- except the empty (zero-length) string, which is a valid manifest.
+
+h3. Normalized manifest v1
+
+A normalized manifest is a manifest that meets the following additional restrictions:
+
+* Streams are in alphanumeric order.
+* Each stream name is unique within the manifest.
+* Files within a stream are listed in alphanumeric order.
+* Blocks within a stream are ordered based on order of file tokens of the stream.  A given block is listed at most once in a stream.
+* Filename must not contain @"/"@ (the stream name represents the path prefix)
+
+h3. Example manifests
+
+A manifest with four files in two directories:
+
+<pre>
+. 930625b054ce894ac40596c3f5a0d947+33 0:0:a 0:0:b 0:33:output.txt
+./c d41d8cd98f00b204e9800998ecf8427e+0 0:0:d
+</pre>
+
+The same manifest with permission signatures on each block:
+
+<pre>
+. 930625b054ce894ac40596c3f5a0d947+33+A1f27a35dd9af37191d63ad8eb8985624451e7b79@5835c8bc 0:0:a 0:0:b 0:33:output.txt
+./c d41d8cd98f00b204e9800998ecf8427e+0+A27117dcd30c013a6e85d6d74c9a50179a1446efa@5835c8bc 0:0:d
+</pre>
+
+A manifest containing a file consisting of multiple blocks and a space in the file name:
+
+<pre>
+. c449ed86671e4a34a8b8b9430850beba+67108864 09fcfea01c3a141b89dd0dcfa1b7768e+22534144 0:89643008:Docker\040image.tar
+</pre>
diff --git a/doc/api/tokens.html.textile.liquid b/doc/api/tokens.html.textile.liquid
new file mode 100644 (file)
index 0000000..72661c3
--- /dev/null
@@ -0,0 +1,63 @@
+---
+layout: default
+navsection: api
+title: API Authorization
+...
+
+All requests to the API server must have an API token.  API tokens can be issued by going though the login flow, or created via the API.  At this time, only browser based applications can perform login from email/password.  Command line applications and services must use an API token provided via the @ARVADOS_API_TOKEN@ environment variable or configuration file.
+
+h2. Browser login
+
+Browser based applications can perform log in via the following highlevel flow:
+
+# The web application presents a "login" link to @/login@ on the API server with a @return_to@ parameter provided in the query portion of the URL.  For example @https://{{ site.arvados_api_host }}/login?return_to=XXX@ , where  @return_to=XXX@ is the URL of the login page for the web application.
+# The "login" link takes the browser to the login page (this may involve several redirects)
+# The user logs in.  API server authenticates the user and issues a new API token.
+# The browser is redirected to the login page URL provided in @return_to=XXX@ with the addition of @?api_token=xxxxapitokenxxxx@.
+# The web application gets the login request with the included authorization token.
+
+!{{site.baseurl}}/images/Session_Establishment.svg!
+
+The "browser authentication process is documented in detail on the Arvados wiki.":https://dev.arvados.org/projects/arvados/wiki/Workbench_authentication_process
+
+h2. Creating tokens via the API
+
+The browser login method above issues a new token.  Using that token, it is possible to make API calls to create additional tokens.  To do so, use the @create@ method of the "API client authorizations":{{site.baseurl}}/api/methods/api_client_authorizations.html resource.
+
+h2. Trusted API clients
+
+The "api_clients":{{site.baseurl}}/api/methods/api_clients.html resource determines if web applications that have gone through the browser login flow may create or list API tokens.
+
+After the user has authenticated, but before an authorization token is issued and browser redirect sent (sending the browser back to the @return_to@ login page bearing @api_token@), the server strips the path and query portion from @return_to@ to get @url_prefix@.  The @url_prefix@ is used to find or create an ApiClient object.  The newly issued API client authorization (API token) is associated with this ApiClient object.
+
+API clients may be marked as "trusted" by making an API call to create or update an "api_clients":{{site.baseurl}}/api/methods/api_clients.html resource and set the @is_trusted@ flag to @true@. An authorization token associated with a "trusted" client is permitted to list authorization tokens on "API client authorizations":{{site.baseurl}}/api/methods/api_client_authorizations.html .
+
+A authorization token which is not associated with a trusted client may only use the @current@ method to query its own api_client_authorization object.  The "untrusted" token is forbidden performing any other operations on API client authorizations, such as listing other authorizations or creating new authorizations.
+
+Authorization tokens which are not issued via the browser login flow (created directly via the API) will not have an associated api client.  This means authorization tokens created via the API are always "untrusted".
+
+h2(#scopes). Scopes
+
+Scopes can restrict a token so it may only access certain resources.  This is in addition to normal permission checks for the user associated with the token.
+
+Each entry in scopes consists of a @request_method@ and @request_path@, where the @request_method@ is a HTTP method (one of @GET@, @POST@, @PUT@ or @DELETE@) and @request_path@ is the request URI.  A given request is permitted if it matches a scopes exactly, or the scope ends with @/@ and the request string is a prefix of the scope.
+
+As a special case, a scope of ["all"] allows all resources.
+
+h3. Scope examples
+
+A scope of @GET /arvados/v1/collections@ permits listing collections.
+
+* Requests with different methods, such as creating a new collection using @POST /arvados/v1/collections@, will be rejected.
+* Requests to access other resources, such as @GET /arvados/v1/groups@, will be rejected.
+* Be aware that requests for specific records, such as @GET /arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km@ will also be rejected.  This is because the scope @GET /arvados/v1/collections@ does not end in @/@
+
+A scope of @GET /arvados/v1/collections/@ (with @/@ suffix) will permit access to individual collections.
+
+* The request @GET /arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km@ will succeed
+* Be aware that requests for listing @GET /arvados/v1/collections@ (no @/@ suffix) will be rejected, because it is not a match with the rule @GET /arvados/v1/collections/@
+* A listing request @GET /arvados/v1/collections/@ will have the trailing @/@ suffix trimmed before the scope check, as a result it will not match the rule @GET /arvados/v1/collections/@.
+
+To allow both listing objects and requesting individual objects, include both in the scope: @["GET /arvados/v1/collections", "GET /arvados/v1/collections/"]@
+
+A narrow scope such as @GET /arvados/v1/collections/962eh-4zz18-xi32mpz2621o8km@ will disallow listing objects as well as disallow requesting any object other than those listed in the scope.
diff --git a/doc/images/Arvados_Permissions.svg b/doc/images/Arvados_Permissions.svg
new file mode 100644 (file)
index 0000000..018a172
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 1381.4540682414697 465.73490813648294" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l1381.4541 0l0 465.7349l-1381.4541 0l0 -465.7349z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l1381.4541 0l0 465.7349l-1381.4541 0z" fill-rule="nonzero"></path><path fill="#76a5af" d="m167.81102 247.17343l0 0c0 -5.809967 4.709915 -10.519882 10.519897 -10.519882l116.660995 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728546 3.0812073 4.648636 3.0812073 7.438675l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099823 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m167.81102 247.17343l0 0c0 -5.809967 4.709915 -10.519882 10.519897 -10.519882l116.660995 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728546 3.0812073 4.648636 3.0812073 7.438675l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099823 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m226.62677 275.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm15.802948 11.296875l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#f3a7eb" fill-opacity="0.5269" d="m322.10236 83.18898l0 0c0 -19.803978 25.586761 -35.858273 57.149628 -35.858273l0 0c31.562836 0 57.149597 16.054295 57.149597 35.858273l0 0c0 19.80397 -25.586761 35.85826 -57.149597 35.85826l0 0c-31.562866 0 -57.149628 -16.05429 -57.149628 -35.85826z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m322.10236 83.18898l0 0c0 -19.803978 25.586761 -35.858273 57.149628 -35.858273l0 0c31.562836 0 57.149597 16.054295 57.149597 35.858273l0 0c0 19.80397 -25.586761 35.85826 -57.149597 35.85826l0 0c-31.562866 0 -57.149628 -16.05429 -57.149628 -35.85826z" fill-rule="nonzero"></path><path fill="#000000" d="m368.687 76.51523l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.59793 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#f3a7eb" fill-opacity="0.5255" d="m730.10236 115.18898l0 0c0 -15.385696 20.7359 -27.858269 46.31494 -27.858269l0 0c25.579102 0 46.315002 12.472572 46.315002 27.858269l0 0c0 15.385696 -20.7359 27.858261 -46.315002 27.858261l0 0c-25.57904 0 -46.31494 -12.472565 -46.31494 -27.858261z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m730.10236 115.18898l0 0c0 -15.385696 20.7359 -27.858269 46.31494 -27.858269l0 0c25.579102 0 46.315002 12.472572 46.315002 27.858269l0 0c0 15.385696 -20.7359 27.858261 -46.315002 27.858261l0 0c-25.57904 0 -46.31494 -12.472565 -46.31494 -27.858261z" fill-rule="nonzero"></path><path fill="#000000" d="m765.85236 108.51522l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm21.722961 11.171875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#f3a7eb" fill-opacity="0.5255" d="m738.10236 319.28348l0 0c0 -13.22876 17.880432 -23.952759 39.93701 -23.952759l0 0c22.05658 0 39.93701 10.723999 39.93701 23.952759l0 0c0 13.228729 -17.880432 23.952728 -39.93701 23.952728l0 0c-22.05658 0 -39.93701 -10.723999 -39.93701 -23.952728z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m738.10236 319.28348l0 0c0 -13.22876 17.880432 -23.952759 39.93701 -23.952759l0 0c22.05658 0 39.93701 10.723999 39.93701 23.952759l0 0c0 13.228729 -17.880432 23.952728 -39.93701 23.952728l0 0c-22.05658 0 -39.93701 -10.723999 -39.93701 -23.952728z" fill-rule="nonzero"></path><path fill="#000000" d="m767.4744 312.6097l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm12.832336 9.984375l2.515625 -0.3125q0.125 0.96875 0.65625 1.484375q0.53125 0.5 1.28125 0.5q0.796875 0 1.34375 -0.609375q0.5625 -0.609375 0.5625 -1.640625q0 -0.984375 -0.53125 -1.5625q-0.53125 -0.578125 -1.28125 -0.578125q-0.5 0 -1.203125 0.203125l0.28125 -2.125q1.0625 0.015625 1.609375 -0.46875q0.5625 -0.484375 0.5625 -1.296875q0 -0.6875 -0.40625 -1.09375q-0.40625 -0.40625 -1.078125 -0.40625q-0.671875 0 -1.140625 0.46875q-0.46875 0.46875 -0.578125 1.359375l-2.40625 -0.421875q0.25 -1.234375 0.75 -1.96875q0.515625 -0.734375 1.421875 -1.15625q0.90625 -0.421875 2.03125 -0.421875q1.90625 0 3.078125 1.21875q0.953125 1.0 0.953125 2.265625q0 1.796875 -1.953125 2.859375q1.15625 0.25 1.859375 1.125q0.703125 0.875 0.703125 2.109375q0 1.78125 -1.3125 3.046875q-1.296875 1.265625 -3.25 1.265625q-1.84375 0 -3.0625 -1.0625q-1.21875 -1.0625 -1.40625 -2.78125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m379.25198 119.04724l-142.58269 117.60631" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m379.25198 119.04724l-137.95406 113.78847" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m240.24692 231.56151l-2.4498596 4.1618195l4.5518646 -1.6134033z" fill-rule="evenodd"></path><path fill="#76a5af" d="m55.811024 383.17343l0 0c0 -5.809967 4.709919 -10.519897 10.519894 -10.519897l116.660995 0c2.7900543 0 5.4658356 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.709915 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099747 0 -10.519894 -4.7099304 -10.519894 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m55.811024 383.17343l0 0c0 -5.809967 4.709919 -10.519897 10.519894 -10.519897l116.660995 0c2.7900543 0 5.4658356 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.709915 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099747 0 -10.519894 -4.7099304 -10.519894 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m114.62677 411.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm17.927948 8.875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#76a5af" d="m287.81104 383.17343l0 0c0 -5.809967 4.7099 -10.519897 10.519897 -10.519897l116.66098 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.66098 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m287.81104 383.17343l0 0c0 -5.809967 4.7099 -10.519897 10.519897 -10.519897l116.66098 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.66098 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m346.62677 411.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm9.037323 7.6875l2.515625 -0.3125q0.125 0.96875 0.65625 1.484375q0.53125 0.5 1.28125 0.5q0.796875 0 1.34375 -0.609375q0.5625 -0.609375 0.5625 -1.640625q0 -0.984375 -0.53125 -1.5625q-0.53125 -0.578125 -1.28125 -0.578125q-0.5 0 -1.203125 0.203125l0.28125 -2.125q1.0625 0.015625 1.609375 -0.46875q0.5625 -0.484375 0.5625 -1.296875q0 -0.6875 -0.40625 -1.09375q-0.40625 -0.40625 -1.078125 -0.40625q-0.671875 0 -1.140625 0.46875q-0.46875 0.46875 -0.578125 1.359375l-2.40625 -0.421875q0.25 -1.234375 0.75 -1.96875q0.515625 -0.734375 1.421875 -1.15625q0.90625 -0.421875 2.03125 -0.421875q1.90625 0 3.078125 1.21875q0.953125 1.0 0.953125 2.265625q0 1.796875 -1.953125 2.859375q1.15625 0.25 1.859375 1.125q0.703125 0.875 0.703125 2.109375q0 1.78125 -1.3125 3.046875q-1.296875 1.265625 -3.25 1.265625q-1.84375 0 -3.0625 -1.0625q-1.21875 -1.0625 -1.40625 -2.78125z" fill-rule="nonzero"></path><path fill="#76a5af" d="m447.81104 247.17343l0 0c0 -5.809967 4.7099 -10.519882 10.519897 -10.519882l116.66101 0c2.790039 0 5.4658203 1.1083374 7.4386597 3.0812073c1.9728394 1.9728546 3.0812378 4.648636 3.0812378 7.438675l0 42.07834c0 5.809967 -4.709961 10.519897 -10.519897 10.519897l-116.66101 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m447.81104 247.17343l0 0c0 -5.809967 4.7099 -10.519882 10.519897 -10.519882l116.66101 0c2.790039 0 5.4658203 1.1083374 7.4386597 3.0812073c1.9728394 1.9728546 3.0812378 4.648636 3.0812378 7.438675l0 42.07834c0 5.809967 -4.709961 10.519897 -10.519897 10.519897l-116.66101 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m506.62677 275.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm14.2404175 11.296875l0 -2.734375l-5.5625 0l0 -2.28125l5.890625 -8.640625l2.1875 0l0 8.625l1.6875 0l0 2.296875l-1.6875 0l0 2.734375l-2.515625 0zm0 -5.03125l0 -4.640625l-3.125 4.640625l3.125 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m730.10236 115.18898l-422.96063 128.06299" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0,1.0,3.0" d="m730.10236 115.18898l-417.21808 126.324265" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m312.40564 239.93239l-3.864746 2.895935l4.8220215 0.26579285z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m738.10236 319.28348l-152.59839 -51.08664" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0,1.0,3.0" d="m738.10236 319.28348l-146.90881 -49.181885" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m591.7179 268.5353l-4.8276978 0.12564087l3.7789917 3.006958z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m379.25198 119.04724l137.41733 117.60631" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m379.25198 119.04724l132.85886 113.70499" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m511.0368 234.00714l4.5217896 1.6958466l-2.3737793 -4.2056427z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m236.66142 299.77167l-112.00001 72.88187" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m236.66142 299.77167l-106.97102 69.609375" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m128.7895 367.9966l-2.902771 3.8595886l4.704544 -1.0907593z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m236.66142 299.77167l119.999985 72.88187" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m236.66142 299.77167l114.87175 69.76724" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m350.67575 370.95065l4.7361755 0.94400024l-3.0213318 -3.767517z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m500.65353 107.34646l142.58267 0l0 47.90551l-142.58267 0z" fill-rule="nonzero"></path><path fill="#000000" d="m512.21606 122.95396l0 1.9375l-1.7969055 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40628052 0.640625q-0.5000305 0.21875 -0.7500305 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.8750305 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4626465 7.7031174l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.5937424 0.515625 -2.7812424q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.8593674q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34374237 0 -0.43749237q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.2343674q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859367l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.6249924l0 6.0625l-1.671875 0l0 -6.0q0 -1.0156174 -0.203125 -1.5156174q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.5781174l0 5.375l-1.671875 0zm8.844482 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm13.735046 -3.78125l-3.015625 -9.859367l1.71875 0l1.5625 5.6874924l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.7812424l1.71875 0l1.46875 5.7187424l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.7031174l1.625 0l-3.078125 9.859367l-1.734375 0l-1.578125 -5.90625l-0.375 -1.6718674l-2.0 7.5781174l-1.734375 0zm11.629211 0l0 -9.859367l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.8906174 -0.28125 1.9531174l0 5.15625l-1.671875 0zm6.2439575 -11.687492l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.687492l0 -9.859367l1.671875 0l0 9.859367l-1.671875 0zm7.7854004 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.6562424l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.7499924q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm8.2771 -1.671875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.4843674 1.265625 -3.8593674q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.7968674q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.2343674 -0.625 -1.8593674q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.0468674zm8.672546 -5.9218674l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m643.4173 256.7638l120.0 0l0 41.95273l-120.0 0z" fill-rule="nonzero"></path><path fill="#000000" d="m654.9798 272.37128l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4627075 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844421 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.891357 -3.78125l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9783325 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547546 4.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469482 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.828857 -6.875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m559.7454 366.88452l114.299194 0l0 51.08661l-114.299194 0z" fill-rule="nonzero"></path><path fill="#000000" d="m571.3079 382.492l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4626465 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844482 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.891296 -3.78125l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9783325 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547607 4.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469421 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.828857 -6.875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m302.40683 310.40683l152.59842 0l0 41.95276l-152.59842 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m321.48495 332.3268l2.671875 0.84375q-0.609375 2.21875 -2.046875 3.3125q-1.421875 1.078125 -3.609375 1.078125q-2.703125 0 -4.453125 -1.84375q-1.734375 -1.859375 -1.734375 -5.078125q0 -3.390625 1.75 -5.265625q1.75 -1.875 4.609375 -1.875q2.5 0 4.046875 1.46875q0.9375 0.875 1.390625 2.5l-2.71875 0.65625q-0.234375 -1.0625 -1.0 -1.671875q-0.765625 -0.609375 -1.859375 -0.609375q-1.515625 0 -2.453125 1.09375q-0.9375 1.078125 -0.9375 3.5q0 2.578125 0.921875 3.6875q0.921875 1.09375 2.40625 1.09375q1.109375 0 1.890625 -0.6875q0.78125 -0.703125 1.125 -2.203125zm7.254181 5.0l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463409 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm6.469452 -1.078125l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm9.453857 -5.125l0 2.078125l-1.78125 0l0 3.984375q0 1.203125 0.046875 1.40625q0.0625 0.1875 0.234375 0.328125q0.1875 0.125 0.453125 0.125q0.359375 0 1.046875 -0.25l0.21875 2.015625q-0.90625 0.390625 -2.0625 0.390625q-0.703125 0 -1.265625 -0.234375q-0.5625 -0.234375 -0.828125 -0.609375q-0.265625 -0.375 -0.375 -1.015625q-0.078125 -0.453125 -0.078125 -1.84375l0 -4.296875l-1.203125 0l0 -2.078125l1.203125 0l0 -1.953125l2.609375 -1.515625l0 3.46875l1.78125 0zm7.400177 6.71875l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563202 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm21.72293 11.171875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m546.8373 393.3071l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m556.5248 415.8052l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm21.7229 11.171875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m514.8373 81.30708l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m524.5248 103.80521l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.5979 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m882.69293 27.729658l444.2834 0l0 407.5276l-444.2834 0z" fill-rule="nonzero"></path><path stroke="#c27ba0" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m882.69293 27.729658l444.2834 0l0 407.5276l-444.2834 0z" fill-rule="nonzero"></path><path fill="#000000" d="m893.06793 54.64966l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm15.3810425 8.15625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm7.0163574 5.765625l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm4.572754 -9.859375l2.40625 0l0 1.359375q1.28125 -1.578125 3.0625 -1.578125q0.953125 0 1.640625 0.390625q0.703125 0.390625 1.140625 1.1875q0.65625 -0.796875 1.40625 -1.1875q0.75 -0.390625 1.609375 -0.390625q1.078125 0 1.828125 0.453125q0.75 0.4375 1.125 1.28125q0.265625 0.640625 0.265625 2.046875l0 6.296875l-2.609375 0l0 -5.625q0 -1.46875 -0.265625 -1.90625q-0.359375 -0.546875 -1.109375 -0.546875q-0.546875 0 -1.03125 0.34375q-0.484375 0.328125 -0.703125 0.96875q-0.203125 0.640625 -0.203125 2.03125l0 4.734375l-2.609375 0l0 -5.40625q0 -1.4375 -0.140625 -1.84375q-0.140625 -0.421875 -0.4375 -0.625q-0.28125 -0.203125 -0.78125 -0.203125q-0.609375 0 -1.09375 0.328125q-0.484375 0.3125 -0.6875 0.9375q-0.203125 0.609375 -0.203125 2.03125l0 4.78125l-2.609375 0l0 -9.859375zm16.775879 -1.328125l0 -2.40625l2.609375 0l0 2.40625l-2.609375 0zm0 11.1875l0 -9.859375l2.609375 0l0 9.859375l-2.609375 0zm4.2770996 -2.8125l2.609375 -0.390625q0.171875 0.75 0.671875 1.15625q0.515625 0.390625 1.4375 0.390625q1.0 0 1.515625 -0.375q0.34375 -0.265625 0.34375 -0.703125q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.875 -0.34375q-3.140625 -0.703125 -4.0 -1.265625q-1.15625 -0.796875 -1.15625 -2.21875q0 -1.28125 1.0 -2.15625q1.015625 -0.875 3.140625 -0.875q2.03125 0 3.0 0.65625q0.984375 0.65625 1.359375 1.953125l-2.453125 0.453125q-0.15625 -0.578125 -0.609375 -0.875q-0.4375 -0.3125 -1.25 -0.3125q-1.03125 0 -1.46875 0.296875q-0.296875 0.203125 -0.296875 0.515625q0 0.28125 0.25 0.484375q0.359375 0.25 2.4375 0.734375q2.078125 0.46875 2.90625 1.15625q0.828125 0.6875 0.828125 1.9375q0 1.359375 -1.140625 2.328125q-1.125 0.96875 -3.34375 0.96875q-2.015625 0 -3.1875 -0.8125q-1.171875 -0.8125 -1.53125 -2.21875zm10.375671 0l2.609375 -0.390625q0.171875 0.75 0.671875 1.15625q0.515625 0.390625 1.4375 0.390625q1.0 0 1.515625 -0.375q0.34375 -0.265625 0.34375 -0.703125q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.875 -0.34375q-3.140625 -0.703125 -4.0 -1.265625q-1.15625 -0.796875 -1.15625 -2.21875q0 -1.28125 1.0 -2.15625q1.015625 -0.875 3.140625 -0.875q2.03125 0 3.0 0.65625q0.984375 0.65625 1.359375 1.953125l-2.453125 0.453125q-0.15625 -0.578125 -0.609375 -0.875q-0.4375 -0.3125 -1.25 -0.3125q-1.03125 0 -1.46875 0.296875q-0.296875 0.203125 -0.296875 0.515625q0 0.28125 0.25 0.484375q0.359375 0.25 2.4375 0.734375q2.078125 0.46875 2.90625 1.15625q0.828125 0.6875 0.828125 1.9375q0 1.359375 -1.140625 2.328125q-1.125 0.96875 -3.34375 0.96875q-2.015625 0 -3.1875 -0.8125q-1.171875 -0.8125 -1.53125 -2.21875zm11.281982 -8.375l0 -2.40625l2.609375 0l0 2.40625l-2.609375 0zm0 11.1875l0 -9.859375l2.609375 0l0 9.859375l-2.609375 0zm4.5895386 -5.0625q0 -1.296875 0.640625 -2.515625q0.640625 -1.21875 1.8125 -1.859375q1.171875 -0.640625 2.609375 -0.640625q2.25 0 3.671875 1.453125q1.421875 1.453125 1.421875 3.671875q0 2.234375 -1.4375 3.703125q-1.4375 1.46875 -3.625 1.46875q-1.359375 0 -2.59375 -0.609375q-1.21875 -0.609375 -1.859375 -1.796875q-0.640625 -1.1875 -0.640625 -2.875zm2.671875 0.140625q0 1.46875 0.6875 2.25q0.703125 0.765625 1.71875 0.765625q1.015625 0 1.703125 -0.765625q0.703125 -0.78125 0.703125 -2.265625q0 -1.453125 -0.703125 -2.234375q-0.6875 -0.78125 -1.703125 -0.78125q-1.015625 0 -1.71875 0.78125q-0.6875 0.78125 -0.6875 2.25zm18.286621 4.921875l-2.609375 0l0 -5.03125q0 -1.59375 -0.171875 -2.0625q-0.15625 -0.46875 -0.53125 -0.71875q-0.375 -0.265625 -0.90625 -0.265625q-0.6875 0 -1.234375 0.375q-0.53125 0.359375 -0.734375 0.984375q-0.1875 0.609375 -0.1875 2.25l0 4.46875l-2.609375 0l0 -9.859375l2.421875 0l0 1.453125q1.296875 -1.671875 3.25 -1.671875q0.859375 0 1.578125 0.3125q0.71875 0.3125 1.078125 0.796875q0.359375 0.484375 0.5 1.09375q0.15625 0.609375 0.15625 1.75l0 6.125zm1.5209961 -2.8125l2.609375 -0.390625q0.171875 0.75 0.671875 1.15625q0.515625 0.390625 1.4375 0.390625q1.0 0 1.515625 -0.375q0.34375 -0.265625 0.34375 -0.703125q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.875 -0.34375q-3.140625 -0.703125 -4.0 -1.265625q-1.15625 -0.796875 -1.15625 -2.21875q0 -1.28125 1.0 -2.15625q1.015625 -0.875 3.140625 -0.875q2.03125 0 3.0 0.65625q0.984375 0.65625 1.359375 1.953125l-2.453125 0.453125q-0.15625 -0.578125 -0.609375 -0.875q-0.4375 -0.3125 -1.25 -0.3125q-1.03125 0 -1.46875 0.296875q-0.296875 0.203125 -0.296875 0.515625q0 0.28125 0.25 0.484375q0.359375 0.25 2.4375 0.734375q2.078125 0.46875 2.90625 1.15625q0.828125 0.6875 0.828125 1.9375q0 1.359375 -1.140625 2.328125q-1.125 0.96875 -3.34375 0.96875q-2.015625 0 -3.1875 -0.8125q-1.171875 -0.8125 -1.53125 -2.21875zm11.781982 -4.4375l0 -2.609375l2.609375 0l0 2.609375l-2.609375 0zm0 7.25l0 -2.609375l2.609375 0l0 2.609375l-2.609375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 85.05591l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm10.1604 13.59375l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm9.090271 -4.078125l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm16.256104 7.140625l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm4.9850464 0l0 -1.90625l1.90625 0l0 1.90625q0 1.046875 -0.375 1.6875q-0.375 0.65625 -1.171875 1.0l-0.46875 -0.71875q0.53125 -0.21875 0.78125 -0.671875q0.25 -0.453125 0.28125 -1.296875l-0.953125 0zm10.147888 0l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm18.740417 5.53125l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm2.5007324 1.609375l0 -1.90625l1.90625 0l0 1.90625q0 1.046875 -0.375 1.6875q-0.375 0.65625 -1.171875 1.0l-0.46875 -0.71875q0.53125 -0.21875 0.78125 -0.671875q0.25 -0.453125 0.28125 -1.296875l-0.953125 0zm10.147888 0l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm9.9747925 3.546875l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm11.266357 3.59375l0 -1.90625l1.906189 0l0 1.90625q0 1.046875 -0.375 1.6875q-0.375 0.65625 -1.171814 1.0l-0.46875 -0.71875q0.53125 -0.21875 0.78125 -0.671875q0.25 -0.453125 0.28125 -1.296875l-0.953125 0zm10.147888 0l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm15.318481 7.140625l0 -3.25l-5.90625 0l0 -1.53125l6.21875 -8.8125l1.359375 0l0 8.8125l1.84375 0l0 1.53125l-1.84375 0l0 3.25l-1.671875 0zm0 -4.78125l0 -6.140625l-4.25 6.140625l4.25 0zm10.027832 0.703125l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm13.349121 -7.234375l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4626465 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844482 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.906982 -3.78125l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm21.978271 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.7819824 5.75l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047607 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.672607 -5.921875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0zm12.145996 15.796875q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm2.4001465 -8.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm11.110107 4.921875l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.644775 0l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm17.125732 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm7.3221436 4.0l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 129.05591l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm12.644775 11.984375l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm6.605896 -2.46875l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm16.256104 7.140625l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm9.090271 -4.078125l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm13.34906 -7.234375l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4627075 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844421 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm13.735107 -3.78125l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.62915 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.2440186 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm7.7854004 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm8.2771 -1.671875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.672607 -5.921875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0zm12.145874 15.796875q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm2.3533936 -6.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 2.9375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0631104 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.978394 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm15.99646 4.921875l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm8.766357 8.796875l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm23.730103 -17.390625l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm10.160522 13.59375l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm5.6413574 4.0l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 173.05591l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm12.644775 11.984375l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm6.605896 -2.46875l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm18.740479 5.53125l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm6.605896 -2.46875l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm13.34906 -7.234375l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4627075 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844421 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.906982 -3.78125l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm21.978271 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.7819824 5.75l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047607 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.672607 -5.921875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0zm12.145996 15.796875q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm2.3532715 -6.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 2.9375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm15.99646 4.921875l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm8.766357 8.796875l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm23.730225 -17.390625l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm10.1604 13.59375l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm9.090332 -4.078125l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm11.739746 4.890625l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.281982 5.109375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.6657715 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm14.031982 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.85510254 -1.4375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375z" fill-rule="nonzero"></path><path fill="#000000" d="m892.94293 212.43091l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.610046 1.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.2283325 0l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm15.5563965 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.4573364 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.328125 0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.015625 -8.75l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.5042114 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281921 4.921875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm19.215271 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.9020996 -3.421875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm13.793396 1.984375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 2.9375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm13.668335 0.953125q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm12.938232 3.421875l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270996 1.5l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm17.125732 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.5563965 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm14.511353 0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm16.453125 2.9375l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm10.360107 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.890625 3.609375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm21.996582 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.4069824 2.0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm24.323853 -10.65625l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm3.8792725 10.0l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm11.922607 7.59375l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 239.05591l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm12.644775 11.984375l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm6.605896 -2.46875l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm9.9748535 3.546875l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm15.371521 -0.484375l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm13.34906 -7.234375l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4627075 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844421 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm13.735107 -3.78125l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.62915 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.2440186 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm7.7854004 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm8.2771 -1.671875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.672607 -5.921875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0zm12.145874 15.796875q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm3.0408936 -15.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.1291504 0l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm10.375732 0l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm17.125732 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.2438965 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm7.7854004 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm8.2771 -1.671875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm14.855835 4.921875l0 -8.546875l-1.484375 0l0 -1.3125l1.484375 0l0 -1.046875q0 -0.984375 0.171875 -1.46875q0.234375 -0.65625 0.84375 -1.046875q0.609375 -0.40625 1.703125 -0.40625q0.703125 0 1.5625 0.15625l-0.25 1.46875q-0.515625 -0.09375 -0.984375 -0.09375q-0.765625 0 -1.078125 0.328125q-0.3125 0.3125 -0.3125 1.203125l0 0.90625l1.921875 0l0 1.3125l-1.921875 0l0 8.546875l-1.65625 0zm4.7614746 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.6032715 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm20.942871 0l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm16.256104 7.140625l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm5.6412354 4.0l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 283.05588l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm12.644775 11.984375l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm6.605896 -2.46875l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm15.3186035 7.140625l0 -3.25l-5.90625 0l0 -1.53125l6.21875 -8.8125l1.359375 0l0 8.8125l1.84375 0l0 1.53125l-1.84375 0l0 3.25l-1.671875 0zm0 -4.78125l0 -6.140625l-4.25 6.140625l4.25 0zm10.027771 0.703125l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.03656 4.078125l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm9.750732 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm17.125732 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 327.05588l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm3.8791504 10.0l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm15.371521 -0.484375l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm16.256104 7.140625l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm4.9850464 0l0 -1.90625l1.90625 0l0 1.90625q0 1.046875 -0.375 1.6875q-0.375 0.65625 -1.171875 1.0l-0.46875 -0.71875q0.53125 -0.21875 0.78125 -0.671875q0.25 -0.453125 0.28125 -1.296875l-0.953125 0zm10.147888 0l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm9.9747925 3.546875l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm15.371521 -0.484375l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.036621 4.078125l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm9.750732 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm17.125732 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 371.05588l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm3.8791504 10.0l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm15.371521 -0.484375l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm18.740479 5.53125l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm6.605896 -2.46875l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm13.34906 -7.234375l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4627075 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844421 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.891357 -3.78125l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547607 4.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469482 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.828857 -6.875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0zm12.145996 15.796875q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm2.3532715 -6.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 2.9375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm15.99646 4.921875l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm8.766357 8.796875l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm23.730225 -17.390625l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm12.644775 11.984375l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm3.1569824 5.609375l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m902.08356 415.05588l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm3.8791504 10.0l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm15.371521 -0.484375l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm12.255371 4.078125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm15.3186035 7.140625l0 -3.25l-5.90625 0l0 -1.53125l6.21875 -8.8125l1.359375 0l0 8.8125l1.84375 0l0 1.53125l-1.84375 0l0 3.25l-1.671875 0zm0 -4.78125l0 -6.140625l-4.25 6.140625l4.25 0zm10.027771 0.703125l0 -1.6875l5.125 0l0 1.6875l-5.125 0zm13.34906 -7.234375l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4627075 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844421 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.891357 -3.78125l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547607 4.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469482 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.828857 -6.875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0zm12.145996 15.796875q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm2.3532715 -6.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 2.9375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm15.99646 4.921875l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm8.766357 8.796875l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm23.730225 -17.390625l1.796875 0l0 7.84375q0 2.0625 -0.46875 3.265625q-0.453125 1.203125 -1.671875 1.96875q-1.203125 0.75 -3.171875 0.75q-1.90625 0 -3.125 -0.65625q-1.21875 -0.65625 -1.734375 -1.90625q-0.515625 -1.25 -0.515625 -3.421875l0 -7.84375l1.796875 0l0 7.84375q0 1.765625 0.328125 2.609375q0.328125 0.84375 1.125 1.296875q0.8125 0.453125 1.96875 0.453125q1.984375 0 2.828125 -0.890625q0.84375 -0.90625 0.84375 -3.46875l0 -7.84375zm10.1604 13.59375l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm5.6413574 4.0l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m748.18634 137.59842l-557.7638 242.01575" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0,1.0,3.0" d="m748.18634 137.59842l-552.2596 239.62747" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m195.26929 375.71063l-3.5056152 3.3216248l4.8205566 -0.2911377z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m634.56696 151.3307l152.59839 0l0 41.95276l-152.59839 0z" fill-rule="nonzero"></path><path fill="#000000" d="m646.12946 166.9382l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4626465 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844482 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.906921 -3.78125l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm21.978333 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813171 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.7819824 5.75l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047607 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.672607 -5.921875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m602.8373 289.3071l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m612.5248 311.8052l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.5979 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m618.8373 177.30708l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m628.5248 199.8052l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.5979 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#76a5af" d="m167.81102 247.17343l0 0c0 -5.809967 4.709915 -10.519882 10.519897 -10.519882l116.660995 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728546 3.0812073 4.648636 3.0812073 7.438675l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099823 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m167.81102 247.17343l0 0c0 -5.809967 4.709915 -10.519882 10.519897 -10.519882l116.660995 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728546 3.0812073 4.648636 3.0812073 7.438675l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099823 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m226.62677 275.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm15.802948 11.296875l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#f3a7eb" fill-opacity="0.5269" d="m322.10236 83.18898l0 0c0 -19.803978 25.586761 -35.858273 57.149628 -35.858273l0 0c31.562836 0 57.149597 16.054295 57.149597 35.858273l0 0c0 19.80397 -25.586761 35.85826 -57.149597 35.85826l0 0c-31.562866 0 -57.149628 -16.05429 -57.149628 -35.85826z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m322.10236 83.18898l0 0c0 -19.803978 25.586761 -35.858273 57.149628 -35.858273l0 0c31.562836 0 57.149597 16.054295 57.149597 35.858273l0 0c0 19.80397 -25.586761 35.85826 -57.149597 35.85826l0 0c-31.562866 0 -57.149628 -16.05429 -57.149628 -35.85826z" fill-rule="nonzero"></path><path fill="#000000" d="m368.687 76.51523l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.59793 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#f3a7eb" fill-opacity="0.5255" d="m730.10236 115.18898l0 0c0 -15.385696 20.7359 -27.858269 46.31494 -27.858269l0 0c25.579102 0 46.315002 12.472572 46.315002 27.858269l0 0c0 15.385696 -20.7359 27.858261 -46.315002 27.858261l0 0c-25.57904 0 -46.31494 -12.472565 -46.31494 -27.858261z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m730.10236 115.18898l0 0c0 -15.385696 20.7359 -27.858269 46.31494 -27.858269l0 0c25.579102 0 46.315002 12.472572 46.315002 27.858269l0 0c0 15.385696 -20.7359 27.858261 -46.315002 27.858261l0 0c-25.57904 0 -46.31494 -12.472565 -46.31494 -27.858261z" fill-rule="nonzero"></path><path fill="#000000" d="m765.85236 108.51522l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm21.722961 11.171875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#f3a7eb" fill-opacity="0.5255" d="m738.10236 319.28348l0 0c0 -13.22876 17.880432 -23.952759 39.93701 -23.952759l0 0c22.05658 0 39.93701 10.723999 39.93701 23.952759l0 0c0 13.228729 -17.880432 23.952728 -39.93701 23.952728l0 0c-22.05658 0 -39.93701 -10.723999 -39.93701 -23.952728z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m738.10236 319.28348l0 0c0 -13.22876 17.880432 -23.952759 39.93701 -23.952759l0 0c22.05658 0 39.93701 10.723999 39.93701 23.952759l0 0c0 13.228729 -17.880432 23.952728 -39.93701 23.952728l0 0c-22.05658 0 -39.93701 -10.723999 -39.93701 -23.952728z" fill-rule="nonzero"></path><path fill="#000000" d="m767.4744 312.6097l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm12.832336 9.984375l2.515625 -0.3125q0.125 0.96875 0.65625 1.484375q0.53125 0.5 1.28125 0.5q0.796875 0 1.34375 -0.609375q0.5625 -0.609375 0.5625 -1.640625q0 -0.984375 -0.53125 -1.5625q-0.53125 -0.578125 -1.28125 -0.578125q-0.5 0 -1.203125 0.203125l0.28125 -2.125q1.0625 0.015625 1.609375 -0.46875q0.5625 -0.484375 0.5625 -1.296875q0 -0.6875 -0.40625 -1.09375q-0.40625 -0.40625 -1.078125 -0.40625q-0.671875 0 -1.140625 0.46875q-0.46875 0.46875 -0.578125 1.359375l-2.40625 -0.421875q0.25 -1.234375 0.75 -1.96875q0.515625 -0.734375 1.421875 -1.15625q0.90625 -0.421875 2.03125 -0.421875q1.90625 0 3.078125 1.21875q0.953125 1.0 0.953125 2.265625q0 1.796875 -1.953125 2.859375q1.15625 0.25 1.859375 1.125q0.703125 0.875 0.703125 2.109375q0 1.78125 -1.3125 3.046875q-1.296875 1.265625 -3.25 1.265625q-1.84375 0 -3.0625 -1.0625q-1.21875 -1.0625 -1.40625 -2.78125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m379.25198 119.04724l-142.58269 117.60631" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m379.25198 119.04724l-137.95406 113.78847" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m240.24692 231.56151l-2.4498596 4.1618195l4.5518646 -1.6134033z" fill-rule="evenodd"></path><path fill="#76a5af" d="m55.811024 383.17343l0 0c0 -5.809967 4.709919 -10.519897 10.519894 -10.519897l116.660995 0c2.7900543 0 5.4658356 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.709915 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099747 0 -10.519894 -4.7099304 -10.519894 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m55.811024 383.17343l0 0c0 -5.809967 4.709919 -10.519897 10.519894 -10.519897l116.660995 0c2.7900543 0 5.4658356 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.709915 10.519897 -10.519897 10.519897l-116.660995 0c-5.8099747 0 -10.519894 -4.7099304 -10.519894 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m114.62677 411.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm17.927948 8.875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#76a5af" d="m447.81104 247.17343l0 0c0 -5.809967 4.7099 -10.519882 10.519897 -10.519882l116.66101 0c2.790039 0 5.4658203 1.1083374 7.4386597 3.0812073c1.9728394 1.9728546 3.0812378 4.648636 3.0812378 7.438675l0 42.07834c0 5.809967 -4.709961 10.519897 -10.519897 10.519897l-116.66101 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m447.81104 247.17343l0 0c0 -5.809967 4.7099 -10.519882 10.519897 -10.519882l116.66101 0c2.790039 0 5.4658203 1.1083374 7.4386597 3.0812073c1.9728394 1.9728546 3.0812378 4.648636 3.0812378 7.438675l0 42.07834c0 5.809967 -4.709961 10.519897 -10.519897 10.519897l-116.66101 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m506.62677 275.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm14.2404175 11.296875l0 -2.734375l-5.5625 0l0 -2.28125l5.890625 -8.640625l2.1875 0l0 8.625l1.6875 0l0 2.296875l-1.6875 0l0 2.734375l-2.515625 0zm0 -5.03125l0 -4.640625l-3.125 4.640625l3.125 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m730.10236 115.18898l-422.96063 128.06299" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0,1.0,3.0" d="m730.10236 115.18898l-417.21808 126.324265" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m312.40564 239.93239l-3.864746 2.895935l4.8220215 0.26579285z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m738.10236 319.28348l-152.59839 -51.08664" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0,1.0,3.0" d="m738.10236 319.28348l-146.90881 -49.181885" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m591.7179 268.5353l-4.8276978 0.12564087l3.7789917 3.006958z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m379.25198 119.04724l137.41733 117.60631" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m379.25198 119.04724l132.85886 113.70499" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m511.0368 234.00714l4.5217896 1.6958466l-2.3737793 -4.2056427z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m236.66142 299.77167l-112.00001 72.88187" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m236.66142 299.77167l-106.97102 69.609375" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m128.7895 367.9966l-2.902771 3.8595886l4.704544 -1.0907593z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m236.66142 299.77167l119.999985 72.88187" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m236.66142 299.77167l114.87175 69.76724" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m350.67575 370.95065l4.7361755 0.94400024l-3.0213318 -3.767517z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m749.7996 336.2206l-556.28345 68.0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0,1.0,3.0" d="m749.7996 336.2206l-550.32776 67.272" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m199.27144 401.8531l-4.3041534 2.190155l4.7049713 1.0888977z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m559.7454 366.88452l114.299194 0l0 51.08661l-114.299194 0z" fill-rule="nonzero"></path><path fill="#000000" d="m571.3079 382.492l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm2.875 0l0 1.9375l-1.796875 0l0 -1.53125q0 -1.25 0.296875 -1.796875q0.390625 -0.75 1.234375 -1.125l0.40625 0.640625q-0.5 0.21875 -0.75 0.640625q-0.234375 0.421875 -0.265625 1.234375l0.875 0zm8.4626465 7.703125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm8.844482 3.78125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.891296 -3.78125l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9783325 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547607 4.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469421 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.828857 -6.875l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.265625 -1.203125l-0.859375 0zm2.875 0l0 -1.9375l1.78125 0l0 1.53125q0 1.234375 -0.28125 1.78125q-0.40625 0.75 -1.25 1.140625l-0.40625 -0.671875q0.5 -0.203125 0.75 -0.640625q0.25 -0.4375 0.28125 -1.203125l-0.875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m302.40683 310.40683l152.59842 0l0 41.95276l-152.59842 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m321.48495 332.3268l2.671875 0.84375q-0.609375 2.21875 -2.046875 3.3125q-1.421875 1.078125 -3.609375 1.078125q-2.703125 0 -4.453125 -1.84375q-1.734375 -1.859375 -1.734375 -5.078125q0 -3.390625 1.75 -5.265625q1.75 -1.875 4.609375 -1.875q2.5 0 4.046875 1.46875q0.9375 0.875 1.390625 2.5l-2.71875 0.65625q-0.234375 -1.0625 -1.0 -1.671875q-0.765625 -0.609375 -1.859375 -0.609375q-1.515625 0 -2.453125 1.09375q-0.9375 1.078125 -0.9375 3.5q0 2.578125 0.921875 3.6875q0.921875 1.09375 2.40625 1.09375q1.109375 0 1.890625 -0.6875q0.78125 -0.703125 1.125 -2.203125zm7.254181 5.0l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463409 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm6.469452 -1.078125l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm9.453857 -5.125l0 2.078125l-1.78125 0l0 3.984375q0 1.203125 0.046875 1.40625q0.0625 0.1875 0.234375 0.328125q0.1875 0.125 0.453125 0.125q0.359375 0 1.046875 -0.25l0.21875 2.015625q-0.90625 0.390625 -2.0625 0.390625q-0.703125 0 -1.265625 -0.234375q-0.5625 -0.234375 -0.828125 -0.609375q-0.265625 -0.375 -0.375 -1.015625q-0.078125 -0.453125 -0.078125 -1.84375l0 -4.296875l-1.203125 0l0 -2.078125l1.203125 0l0 -1.953125l2.609375 -1.515625l0 3.46875l1.78125 0zm7.400177 6.71875l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563202 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm21.72293 11.171875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m546.8373 393.3071l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m556.5248 415.8052l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm21.7229 11.171875l0 2.421875l-9.140625 0q0.15625 -1.375 0.890625 -2.59375q0.75 -1.234375 2.9375 -3.265625q1.765625 -1.640625 2.15625 -2.234375q0.546875 -0.796875 0.546875 -1.59375q0 -0.875 -0.46875 -1.34375q-0.46875 -0.46875 -1.296875 -0.46875q-0.8125 0 -1.296875 0.5q-0.484375 0.484375 -0.5625 1.625l-2.59375 -0.25q0.234375 -2.15625 1.453125 -3.09375q1.21875 -0.9375 3.0625 -0.9375q2.015625 0 3.15625 1.09375q1.15625 1.078125 1.15625 2.6875q0 0.921875 -0.328125 1.75q-0.328125 0.828125 -1.046875 1.734375q-0.46875 0.609375 -1.703125 1.75q-1.234375 1.125 -1.5625 1.5q-0.328125 0.359375 -0.53125 0.71875l5.171875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m602.8373 289.3071l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m612.5248 311.8052l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.5979 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m618.8373 177.30708l142.58264 0l0 41.95276l-142.58264 0z" fill-rule="nonzero"></path><path fill="#a61c00" d="m628.5248 199.8052l2.671875 -0.265625q0.234375 1.34375 0.96875 1.984375q0.75 0.625 2.0 0.625q1.328125 0 2.0 -0.5625q0.671875 -0.5625 0.671875 -1.3125q0 -0.484375 -0.28125 -0.8125q-0.28125 -0.34375 -0.984375 -0.59375q-0.484375 -0.171875 -2.203125 -0.59375q-2.203125 -0.546875 -3.09375 -1.34375q-1.265625 -1.125 -1.265625 -2.734375q0 -1.046875 0.59375 -1.953125q0.59375 -0.90625 1.703125 -1.375q1.109375 -0.46875 2.671875 -0.46875q2.5625 0 3.859375 1.125q1.296875 1.109375 1.359375 2.984375l-2.75 0.125q-0.171875 -1.046875 -0.75 -1.5q-0.578125 -0.46875 -1.75 -0.46875q-1.1875 0 -1.875 0.5q-0.4375 0.3125 -0.4375 0.84375q0 0.484375 0.421875 0.828125q0.515625 0.421875 2.515625 0.90625q2.0 0.46875 2.953125 0.984375q0.96875 0.5 1.515625 1.375q0.546875 0.875 0.546875 2.15625q0 1.171875 -0.65625 2.203125q-0.640625 1.015625 -1.828125 1.515625q-1.1875 0.484375 -2.96875 0.484375q-2.578125 0 -3.96875 -1.1875q-1.375 -1.1875 -1.640625 -3.46875zm15.7247925 -9.171875l0 5.0q1.25 -1.484375 3.015625 -1.484375q0.890625 0 1.609375 0.34375q0.734375 0.328125 1.09375 0.84375q0.375 0.515625 0.5 1.15625q0.140625 0.625 0.140625 1.953125l0 5.78125l-2.609375 0l0 -5.203125q0 -1.546875 -0.15625 -1.96875q-0.140625 -0.421875 -0.515625 -0.65625q-0.375 -0.25 -0.9375 -0.25q-0.65625 0 -1.171875 0.3125q-0.5 0.3125 -0.734375 0.953125q-0.234375 0.640625 -0.234375 1.875l0 4.9375l-2.609375 0l0 -13.59375l2.609375 0zm10.739746 6.75l-2.359375 -0.4375q0.390625 -1.421875 1.359375 -2.109375q0.984375 -0.6875 2.90625 -0.6875q1.734375 0 2.59375 0.421875q0.859375 0.40625 1.203125 1.046875q0.34375 0.625 0.34375 2.328125l-0.03125 3.046875q0 1.296875 0.125 1.921875q0.125 0.609375 0.46875 1.3125l-2.578125 0q-0.09375 -0.265625 -0.25 -0.765625q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.65625 -1.421875 0.984375q-0.765625 0.3125 -1.625 0.3125q-1.515625 0 -2.40625 -0.8125q-0.875 -0.828125 -0.875 -2.09375q0 -0.84375 0.390625 -1.484375q0.40625 -0.65625 1.125 -1.0q0.71875 -0.359375 2.078125 -0.625q1.828125 -0.328125 2.53125 -0.625l0 -0.265625q0 -0.75 -0.375 -1.0625q-0.359375 -0.328125 -1.390625 -0.328125q-0.703125 0 -1.09375 0.28125q-0.390625 0.265625 -0.625 0.953125zm3.484375 2.109375q-0.5 0.171875 -1.59375 0.40625q-1.078125 0.234375 -1.40625 0.453125q-0.515625 0.359375 -0.515625 0.921875q0 0.546875 0.40625 0.953125q0.40625 0.390625 1.046875 0.390625q0.703125 0 1.34375 -0.46875q0.46875 -0.359375 0.625 -0.859375q0.09375 -0.34375 0.09375 -1.28125l0 -0.515625zm7.4382324 4.734375l-2.609375 0l0 -9.859375l2.421875 0l0 1.40625q0.625 -0.984375 1.109375 -1.296875q0.5 -0.328125 1.140625 -0.328125q0.890625 0 1.71875 0.5l-0.8125 2.265625q-0.65625 -0.421875 -1.21875 -0.421875q-0.546875 0 -0.9375 0.296875q-0.375 0.296875 -0.59375 1.09375q-0.21875 0.78125 -0.21875 3.296875l0 3.046875zm10.463379 -3.140625l2.609375 0.4375q-0.5 1.4375 -1.59375 2.1875q-1.078125 0.734375 -2.703125 0.734375q-2.5625 0 -3.796875 -1.671875q-0.96875 -1.34375 -0.96875 -3.40625q0 -2.4375 1.265625 -3.828125q1.28125 -1.390625 3.25 -1.390625q2.1875 0 3.453125 1.453125q1.28125 1.453125 1.234375 4.453125l-6.53125 0q0.015625 1.15625 0.625 1.8125q0.609375 0.640625 1.5 0.640625q0.609375 0 1.03125 -0.328125q0.421875 -0.34375 0.625 -1.09375zm0.15625 -2.625q-0.03125 -1.140625 -0.59375 -1.71875q-0.546875 -0.59375 -1.34375 -0.59375q-0.859375 0 -1.40625 0.625q-0.5625 0.609375 -0.546875 1.6875l3.890625 0zm13.563232 5.765625l-2.421875 0l0 -1.453125q-0.609375 0.84375 -1.4375 1.265625q-0.8125 0.40625 -1.640625 0.40625q-1.703125 0 -2.921875 -1.359375q-1.203125 -1.375 -1.203125 -3.828125q0 -2.5 1.171875 -3.796875q1.1875 -1.3125 2.984375 -1.3125q1.65625 0 2.859375 1.375l0 -4.890625l2.609375 0l0 13.59375zm-6.96875 -5.140625q0 1.578125 0.4375 2.28125q0.640625 1.015625 1.765625 1.015625q0.90625 0 1.53125 -0.765625q0.625 -0.765625 0.625 -2.28125q0 -1.703125 -0.609375 -2.4375q-0.609375 -0.75 -1.5625 -0.75q-0.9375 0 -1.5625 0.734375q-0.625 0.734375 -0.625 2.203125zm14.391785 5.140625l0 -13.59375l2.609375 0l0 4.890625q1.203125 -1.375 2.859375 -1.375q1.796875 0 2.96875 1.3125q1.1875 1.296875 1.1875 3.734375q0 2.53125 -1.203125 3.890625q-1.203125 1.359375 -2.921875 1.359375q-0.84375 0 -1.671875 -0.421875q-0.8125 -0.421875 -1.40625 -1.25l0 1.453125l-2.421875 0zm2.59375 -5.140625q0 1.53125 0.484375 2.265625q0.671875 1.03125 1.796875 1.03125q0.859375 0 1.46875 -0.734375q0.609375 -0.734375 0.609375 -2.328125q0 -1.6875 -0.609375 -2.421875q-0.609375 -0.75 -1.578125 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.203125zm7.677246 -4.71875l2.78125 0l2.359375 7.0l2.296875 -7.0l2.703125 0l-3.484375 9.484375l-0.625 1.71875q-0.34375 0.859375 -0.65625 1.3125q-0.296875 0.46875 -0.703125 0.75q-0.40625 0.28125 -1.0 0.4375q-0.59375 0.15625 -1.328125 0.15625q-0.75 0 -1.46875 -0.15625l-0.234375 -2.046875q0.609375 0.125 1.09375 0.125q0.921875 0 1.34375 -0.53125q0.4375 -0.53125 0.671875 -1.359375l-3.75 -9.890625zm16.793396 -3.734375l2.75 0l0 7.359375q0 1.75 0.109375 2.265625q0.171875 0.84375 0.828125 1.359375q0.671875 0.5 1.8125 0.5q1.171875 0 1.765625 -0.484375q0.59375 -0.484375 0.71875 -1.171875q0.125 -0.703125 0.125 -2.3125l0 -7.515625l2.734375 0l0 7.140625q0 2.4375 -0.21875 3.453125q-0.21875 1.015625 -0.828125 1.71875q-0.59375 0.6875 -1.59375 1.109375q-1.0 0.40625 -2.609375 0.40625q-1.953125 0 -2.96875 -0.453125q-1.0 -0.453125 -1.59375 -1.171875q-0.578125 -0.71875 -0.75 -1.5q-0.28125 -1.171875 -0.28125 -3.453125l0 -7.25zm19.5979 13.59375l-2.609375 0l0 -9.828125q-1.4375 1.34375 -3.375 1.984375l0 -2.375q1.03125 -0.328125 2.21875 -1.25q1.203125 -0.9375 1.640625 -2.1875l2.125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#76a5af" d="m287.81104 383.17343l0 0c0 -5.809967 4.7099 -10.519897 10.519897 -10.519897l116.66098 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.66098 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m287.81104 383.17343l0 0c0 -5.809967 4.7099 -10.519897 10.519897 -10.519897l116.66098 0c2.790039 0 5.4658203 1.1083374 7.43869 3.0812073c1.9728699 1.9728699 3.0812073 4.648651 3.0812073 7.43869l0 42.07834c0 5.809967 -4.7099304 10.519897 -10.519897 10.519897l-116.66098 0c-5.8099976 0 -10.519897 -4.7099304 -10.519897 -10.519897z" fill-rule="nonzero"></path><path fill="#000000" d="m346.62677 411.1326l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm9.037323 7.6875l2.515625 -0.3125q0.125 0.96875 0.65625 1.484375q0.53125 0.5 1.28125 0.5q0.796875 0 1.34375 -0.609375q0.5625 -0.609375 0.5625 -1.640625q0 -0.984375 -0.53125 -1.5625q-0.53125 -0.578125 -1.28125 -0.578125q-0.5 0 -1.203125 0.203125l0.28125 -2.125q1.0625 0.015625 1.609375 -0.46875q0.5625 -0.484375 0.5625 -1.296875q0 -0.6875 -0.40625 -1.09375q-0.40625 -0.40625 -1.078125 -0.40625q-0.671875 0 -1.140625 0.46875q-0.46875 0.46875 -0.578125 1.359375l-2.40625 -0.421875q0.25 -1.234375 0.75 -1.96875q0.515625 -0.734375 1.421875 -1.15625q0.90625 -0.421875 2.03125 -0.421875q1.90625 0 3.078125 1.21875q0.953125 1.0 0.953125 2.265625q0 1.796875 -1.953125 2.859375q1.15625 0.25 1.859375 1.125q0.703125 0.875 0.703125 2.109375q0 1.78125 -1.3125 3.046875q-1.296875 1.265625 -3.25 1.265625q-1.84375 0 -3.0625 -1.0625q-1.21875 -1.0625 -1.40625 -2.78125z" fill-rule="nonzero"></path></g></svg>
+
diff --git a/doc/images/Crunch_dispatch.svg b/doc/images/Crunch_dispatch.svg
new file mode 100644 (file)
index 0000000..aa63962
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 960.0 540.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="g115a30441b_0_35.0"><path d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#g115a30441b_0_35.0)"><path fill="#ffffff" d="m0 0l960.0 0l0 540.0l-960.0 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m32.72441 46.721786l894.55115 0l0 60.125984l-894.55115 0z" fill-rule="nonzero"></path><path fill="#000000" d="m63.47441 82.28053l3.5 0.875q-1.09375 4.328125 -3.96875 6.59375q-2.859375 2.265625 -6.984375 2.265625q-4.28125 0 -6.96875 -1.734375q-2.6875 -1.75 -4.09375 -5.046875q-1.390625 -3.3125 -1.390625 -7.109375q0 -4.140625 1.578125 -7.21875q1.578125 -3.078125 4.5 -4.671875q2.921875 -1.609375 6.421875 -1.609375q3.96875 0 6.671875 2.03125q2.71875 2.015625 3.796875 5.6875l-3.453125 0.8125q-0.921875 -2.890625 -2.6875 -4.203125q-1.75 -1.328125 -4.40625 -1.328125q-3.046875 0 -5.09375 1.46875q-2.046875 1.453125 -2.890625 3.921875q-0.828125 2.46875 -0.828125 5.09375q0 3.375 0.984375 5.890625q0.984375 2.515625 3.0625 3.765625q2.078125 1.25 4.5 1.25q2.953125 0 4.984375 -1.6875q2.046875 -1.703125 2.765625 -5.046875zm7.613434 9.28125l0 -19.1875l2.921875 0l0 2.90625q1.125 -2.03125 2.0625 -2.6875q0.953125 -0.65625 2.09375 -0.65625q1.640625 0 3.34375 1.046875l-1.125 3.015625q-1.1875 -0.703125 -2.375 -0.703125q-1.078125 0 -1.921875 0.640625q-0.84375 0.640625 -1.203125 1.78125q-0.546875 1.734375 -0.546875 3.796875l0 10.046875l-3.25 0zm25.039932 0l0 -2.8125q-2.25 3.25 -6.09375 3.25q-1.6875 0 -3.171875 -0.65625q-1.46875 -0.65625 -2.1875 -1.640625q-0.703125 -0.984375 -1.0 -2.40625q-0.203125 -0.953125 -0.203125 -3.03125l0 -11.890625l3.265625 0l0 10.640625q0 2.546875 0.1875 3.4375q0.3125 1.28125 1.296875 2.015625q1.0 0.734375 2.46875 0.734375q1.453125 0 2.734375 -0.75q1.296875 -0.75 1.828125 -2.046875q0.53125 -1.296875 0.53125 -3.75l0 -10.28125l3.25 0l0 19.1875l-2.90625 0zm8.182007 0l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm33.275757 -7.03125l3.203125 0.421875q-0.515625 3.296875 -2.6875 5.171875q-2.15625 1.875 -5.296875 1.875q-3.9375 0 -6.328125 -2.578125q-2.390625 -2.578125 -2.390625 -7.375q0 -3.109375 1.015625 -5.4375q1.03125 -2.34375 3.140625 -3.5q2.109375 -1.171875 4.578125 -1.171875q3.125 0 5.109375 1.59375q2.0 1.578125 2.546875 4.484375l-3.15625 0.484375q-0.453125 -1.9375 -1.609375 -2.90625q-1.140625 -0.984375 -2.765625 -0.984375q-2.453125 0 -4.0 1.765625q-1.53125 1.765625 -1.53125 5.578125q0 3.859375 1.484375 5.625q1.484375 1.75 3.875 1.75q1.90625 0 3.1875 -1.171875q1.28125 -1.1875 1.625 -3.625zm6.1484375 7.03125l0 -26.484375l3.25 0l0 9.5q2.28125 -2.640625 5.75 -2.640625q2.125 0 3.703125 0.84375q1.578125 0.84375 2.25 2.328125q0.671875 1.46875 0.671875 4.296875l0 12.15625l-3.25 0l0 -12.15625q0 -2.4375 -1.0625 -3.546875q-1.046875 -1.109375 -2.984375 -1.109375q-1.4375 0 -2.71875 0.75q-1.265625 0.734375 -1.8125 2.03125q-0.546875 1.28125 -0.546875 3.53125l0 10.5l-3.25 0zm31.552963 0l0 -26.484375l9.125 0q3.078125 0 4.703125 0.375q2.28125 0.53125 3.890625 1.90625q2.09375 1.765625 3.125 4.53125q1.046875 2.75 1.046875 6.28125q0 3.015625 -0.703125 5.359375q-0.703125 2.328125 -1.8125 3.859375q-1.09375 1.515625 -2.40625 2.390625q-1.3125 0.875 -3.171875 1.328125q-1.84375 0.453125 -4.25 0.453125l-9.546875 0zm3.5 -3.125l5.65625 0q2.625 0 4.109375 -0.484375q1.484375 -0.484375 2.375 -1.375q1.25 -1.25 1.9375 -3.34375q0.703125 -2.109375 0.703125 -5.109375q0 -4.15625 -1.375 -6.390625q-1.359375 -2.234375 -3.3125 -2.984375q-1.40625 -0.546875 -4.53125 -0.546875l-5.5625 0l0 20.234375zm23.050934 -19.625l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm6.9806213 -5.734375l3.21875 -0.5q0.265625 1.9375 1.5 2.96875q1.234375 1.03125 3.46875 1.03125q2.234375 0 3.3125 -0.90625q1.09375 -0.921875 1.09375 -2.15625q0 -1.09375 -0.96875 -1.734375q-0.65625 -0.4375 -3.3125 -1.09375q-3.578125 -0.90625 -4.96875 -1.5625q-1.375 -0.671875 -2.09375 -1.828125q-0.703125 -1.171875 -0.703125 -2.578125q0 -1.28125 0.578125 -2.375q0.59375 -1.09375 1.59375 -1.8125q0.765625 -0.5625 2.078125 -0.953125q1.3125 -0.390625 2.8125 -0.390625q2.25 0 3.953125 0.65625q1.71875 0.65625 2.53125 1.765625q0.8125 1.109375 1.109375 2.96875l-3.171875 0.4375q-0.21875 -1.484375 -1.265625 -2.3125q-1.03125 -0.84375 -2.921875 -0.84375q-2.25 0 -3.203125 0.75q-0.953125 0.734375 -0.953125 1.734375q0 0.625 0.390625 1.140625q0.40625 0.515625 1.25 0.859375q0.484375 0.1875 2.875 0.828125q3.453125 0.921875 4.8125 1.515625q1.359375 0.578125 2.140625 1.703125q0.78125 1.125 0.78125 2.78125q0 1.625 -0.953125 3.0625q-0.953125 1.4375 -2.75 2.234375q-1.78125 0.78125 -4.03125 0.78125q-3.75 0 -5.703125 -1.546875q-1.953125 -1.5625 -2.5 -4.625zm19.960938 13.09375l0 -26.546875l2.96875 0l0 2.5q1.046875 -1.46875 2.359375 -2.203125q1.328125 -0.734375 3.203125 -0.734375q2.453125 0 4.328125 1.265625q1.890625 1.265625 2.84375 3.578125q0.953125 2.296875 0.953125 5.046875q0 2.9375 -1.0625 5.296875q-1.046875 2.359375 -3.0625 3.625q-2.015625 1.25 -4.234375 1.25q-1.625 0 -2.921875 -0.6875q-1.296875 -0.6875 -2.125 -1.734375l0 9.34375l-3.25 0zm2.953125 -16.84375q0 3.703125 1.5 5.484375q1.5 1.765625 3.625 1.765625q2.171875 0 3.703125 -1.828125q1.546875 -1.84375 1.546875 -5.6875q0 -3.671875 -1.515625 -5.5q-1.5 -1.828125 -3.59375 -1.828125q-2.078125 0 -3.671875 1.953125q-1.59375 1.9375 -1.59375 5.640625zm30.322617 7.125q-1.796875 1.53125 -3.46875 2.171875q-1.671875 0.625 -3.5937347 0.625q-3.15625 0 -4.859375 -1.546875q-1.6875 -1.546875 -1.6875 -3.953125q0 -1.40625 0.640625 -2.5625q0.640625 -1.171875 1.671875 -1.875q1.046875 -0.703125 2.34375 -1.0625q0.953125 -0.265625 2.890625 -0.5q3.9374847 -0.46875 5.7968597 -1.109375q0.015625 -0.671875 0.015625 -0.859375q0 -1.984375 -0.921875 -2.796875q-1.25 -1.09375 -3.703125 -1.09375q-2.2968597 0 -3.3906097 0.796875q-1.09375 0.796875 -1.609375 2.84375l-3.1875 -0.4375q0.4375 -2.03125 1.421875 -3.28125q1.0 -1.265625 2.875 -1.9375q1.890625 -0.6875 4.3593597 -0.6875q2.46875 0 4.0 0.578125q1.53125 0.578125 2.25 1.453125q0.734375 0.875 1.015625 2.21875q0.15625 0.828125 0.15625 3.0l0 4.328125q0 4.546875 0.203125 5.75q0.21875 1.1875 0.828125 2.296875l-3.390625 0q-0.5 -1.015625 -0.65625 -2.359375zm-0.265625 -7.265625q-1.765625 0.71875 -5.3125 1.21875q-1.9999847 0.296875 -2.8437347 0.65625q-0.828125 0.359375 -1.28125 1.0625q-0.4375 0.6875 -0.4375 1.53125q0 1.3125 0.984375 2.1875q0.984375 0.859375 2.875 0.859375q1.8749847 0 3.3437347 -0.828125q1.46875 -0.828125 2.15625 -2.25q0.515625 -1.09375 0.515625 -3.25l0 -1.1875zm15.619507 6.71875l0.46875 2.875q-1.375 0.28125 -2.46875 0.28125q-1.765625 0 -2.75 -0.5625q-0.96875 -0.5625 -1.375 -1.46875q-0.390625 -0.90625 -0.390625 -3.84375l0 -11.03125l-2.375 0l0 -2.53125l2.375 0l0 -4.75l3.234375 -1.953125l0 6.703125l3.28125 0l0 2.53125l-3.28125 0l0 11.21875q0 1.390625 0.171875 1.796875q0.171875 0.390625 0.5625 0.625q0.390625 0.234375 1.109375 0.234375q0.546875 0 1.4375 -0.125zm15.777191 -4.125l3.203125 0.421875q-0.515625 3.296875 -2.6875 5.171875q-2.15625 1.875 -5.2968445 1.875q-3.9375 0 -6.328125 -2.578125q-2.390625 -2.578125 -2.390625 -7.375q0 -3.109375 1.015625 -5.4375q1.03125 -2.34375 3.140625 -3.5q2.109375 -1.171875 4.578125 -1.171875q3.1249695 0 5.1093445 1.59375q2.0 1.578125 2.546875 4.484375l-3.15625 0.484375q-0.453125 -1.9375 -1.609375 -2.90625q-1.140625 -0.984375 -2.7655945 -0.984375q-2.453125 0 -4.0 1.765625q-1.53125 1.765625 -1.53125 5.578125q0 3.859375 1.484375 5.625q1.484375 1.75 3.875 1.75q1.9062195 0 3.1874695 -1.171875q1.28125 -1.1875 1.625 -3.625zm6.1484375 7.03125l0 -26.484375l3.25 0l0 9.5q2.28125 -2.640625 5.75 -2.640625q2.125 0 3.703125 0.84375q1.578125 0.84375 2.25 2.328125q0.671875 1.46875 0.671875 4.296875l0 12.15625l-3.25 0l0 -12.15625q0 -2.4375 -1.0625 -3.546875q-1.046875 -1.109375 -2.984375 -1.109375q-1.4375 0 -2.71875 0.75q-1.265625 0.734375 -1.8125 2.03125q-0.546875 1.28125 -0.546875 3.53125l0 10.5l-3.25 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m145.72684 103.48555l673.67993 0l0 505.26257l-673.67993 0z" fill-rule="nonzero"></path><g transform="matrix(0.7017498687664041 0.0 0.0 0.7017535433070867 145.72683779527557 103.48555144356955)"><clipPath id="g115a30441b_0_35.1"><path d="m-2.842171E-14 0l960.0 0l0 720.0l-960.0 0z" clip-rule="nonzero"></path></clipPath><image clip-path="url(#g115a30441b_0_35.1)" fill="#000" width="960.0" height="720.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8AAAALQCAYAAABfdxm0AACAAElEQVR42uy9DXBdTV6f2VXote47rybRBiWIxEmpggpUE4dSBlu6HpRwiTOlbJRCAUGZRAkyuvJ4ZkSNdnBNBJhFL+OaUjIecIFqyjNrQLMxjGFNyrOYxAkGtIxDzGCmBGVYUWtALM6uqHgXb8rsOlnD3r2/63/7/m/r3A99fz1PVZd0z0efPuf27dPP6T7dIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwJ+s915k4Vz7QPFmeODUzOEQiEnQmV39jJ4gkKHQAAAACAPaB9cGq6XCl/Xg4lAoGwS2GgeD0U3m6jBAIAAAAA2D35vRgr5IMTH3s58dEbpelP3CIQCDsUvvW//bHSO7/2wv+n39xb73nfL4bCBzsoiQAAAAAAdphc/lxPuRL+QhXxH/wf/l1p+Q+eEwiEXQg//e/+l9KXD3/4VUtwfuoapREAAAAAwA4TW3+/8hu/GykhEHY5fO5XfrfU9be/o/SO95x/QSswAAAAAMAOYwPylM7PfxYhIRD2IKg7tL0PfIESCQAAAABgFwRY7yUiIwTC7gf99vQb1G+REgkAAAAAAAEmEBBgAAAAAABAgAkEBBgAAAAAAPatAP/a7z0r/cTP/lLp+k/969Kte1/YE/H4wuOnpX/zhd/elXP9V//+t9YFHf8gi9vPf/F3Sp//zf+wbvnSr/9+5vLtCreXvljJN//ic79YubYIMAAAAAAA7FsB/uHP/HTpS//8l5X+4vG/Ujp5+m+W3vHWW6XBoa+vCNV2SO03/sOJlraVRCkNO32+kt3ypS592Zf/pcrxFHT+x9pzpQ9990f3rZjpWn7Dt4zXXa/v7v0f/p51y7VP1vLtEN93ffW7S+/8M3+2cmxdz7/c81crIowAAwAAAADAvhPgn7z7yxXx++gPfur1MrUW/vV3nyr9nb/3D7ZNNvdTC3BMk/765R/7oR+pLJfY7Ucxa3Ytd1OAf3nlDysPDr713IXXrb76q88S4YPcmo4AAwAAAAAcUgGW5I5807euW65u0OPF6ZputN92YaYiWd/8j4s1kqhW0x/7lz9X2V4tx5ItCVKMX9ImCVMckqRL8z9U+vrhv1/ZVnHGlmbFqc/xf8V79Ud+svS3zvzd0vA3fHPlGD6NikfrFJdaseNybad1So/203FbEWAFLf/Ep368pnVc56DjKM70Gum8tE77KO3xuvj/FXQecx//5Lp9dQ3Of+ifvr5esSVc6Y7rYvfl9FpuVoD9dfMPPpqdrw8fefufVwQ47fIs8ZUEx2urdOoc3lN4byVO7Rf30TlPf+T7Kut0vv47VND1yvp+EWAAAAAAAAR4U6Hzz33pOglKgwRMrXrqyiw5k5iqm3QUPImXZEjCJNFTN1hJj9b9s09+piJt2k9yJBH7qr/21aVP3rhd+vTNOxXJk+CkXaD1v7rWSoC0rYRSx4wyKLmN8eiY6sKsFlyt0/loW4mf0pFKWpYAS9SUNu0XhVzxKF6dg46jVvF4XtpX237X5R+oyKwk7kva2irp1nqdR/xfQXHH7svaXuf2nd/7sco2Wq5r6OPVuWidzj+2xKfXcjMCLKlUt+V43ZROf93S8/UPQXzQd9aoO3YMOpa2U5r1kED5LYq1RFnnp3VKg3oiqEdC1vfr04kAAwAAAAAgwJsKUagabSNhkYz4ZWqxU0twFK9v/+B31rQOeqELrtuuWvI02Fb8LNny0uv/l1B60ZMYqnVXEqx1frAuxdP7Ve96LXI9X/GVTbsS+yD5Upr9+6tKi+L1rbbaTi2XEkrJm39I0KoA62+8drHrsMQwDiQlOY7XSGIe/9+OLtD6nvz73XqIER8E6MGFl0x/vq0eKx1sTA8I/P7qbRD300MDPVSJ63WeccCu9PuVPDf6ThFgAAAAAAAEuGlQi5/vmpsKTGyNS1v7vOTqr29F1v/1BFhyo1ZUyaOERlJbT4DTAbGiVEoSFWccwCoOYhWP44/fyjvAik9xeImPDwfi4GAxxP1i63JW+poJsNImyfXx+vewJccSQB1bghhFcLMCrNbauFzvWKtlV/HogYHvYt3ofLO6ztdrAfYt7kq7Wnol3epFoPOOadF1l3TrXP/GqdMVWda+zb5fBBgAAAAAAAHeVFBLrkLWCL+xO7CEJd3Gt4BuRIAlOrFbs+LWthsVYHWTDTZYVTqV0WYEOA4GJhHz56HParFOjyFJk6RK7Hy8Erx6Aqwu3F6Adf3SeH1LqaRUXX8lmpJGrWsmwBLd+A512g1Z3a3Ta6CWfUlw7GLd6HzTOCWrWe8A67NkVWnX96s8JMmW1OocsgbkkiQrfdpP7wQ3+34RYAAAAAAABHhTQWKi1kff1VfyJVFVF1V91ru6krDYbVYiI3GKUwa1IsCxK7MkS/Lru+duVICjZPlBmpQWpXmzAhy7B/vzVKull9w4XZTORYIn4fXdd4PrTq4u42olj1Koz1GAJYCS0iiPapVVF2iJn+LVtn6d4lWaYrrrzbUrKVX6/HkpPdonvlurFmUvydpHaYnn67tm63uK55v1XrjWqXdA1ijQWq9jK2/5Qa/iyNHxYYjvcq24dPxm3y8CDAAAAACAAG86SBglfpLaevMAS5okJZI4dVtVK24Uo0YCrG20n4IkMQqv/kpo1GqpY0t6WhXgKGeSRqVDQf/HUaI3K8BKq84ttnarBVIyp7i0LA5O5eVd2+u9Vl07L8BKg+RPravaxg8aJRFUnOoCrmW6NlEKlQZdlyjM2jd2zdY6nae2j0Kbtr7qOHrIIKlV/Prfz22s7yAOLqZzUnxxhOWs863XPd53YY77xHmA4zvLOk+lQV2udS46J+Wr2OIs2dcxdCylW9/vz3z+N5p+vwgwAAAAAAACvOV5XSUYGmzIDz7kg+RE0pKulyj77rv638uzBjaSGMZ3TSVIiifO+Ru72fp5gLPmBNZn3xqp40iUFBodP0sU63XtVRq9GOt4SrtPb9p9VwKpY4ZkQDFdL63TflqfTl0Ur0M673B8D1brohCm1zJrYKr0uLouWdMlxeumbdL1zc4361rqPJRvlOasaZH8d6Tg49X/Ma1pS3O97xcBBgAAAABAgAl7HEILI2oT9n9AgHeAXP5cTy4/VTiWnxzPDRQnFNoHiiPtp4u9XB0AAAAABBgBPnhB3YCzuiYTEOAjyZuDk0Pt+eJCx9e+/3/TBa0X3jn0/j/KnT7/o9qeqwYAAACAABMIhN0LEx+9YW42dZESaRO8cep8f1lof8FL7pcPf7h0enK+NPqRa6Vvmv105a8+/4X3fqhGht/62gu/9ubgVJ6rCAAAAHA0yA1MFlUPVB0RGSEQdjf82up/qrhapQU4P3WWEmmjBdhg8XKU2a6//R2lD3z8p0qfXWo8f9WP//xvls7Pf7ayfdw3Nzg5Hwpvt3FFAQAAAA43x06/ry+XL/7JO4feX/rMz/0GUkIg7GKY/4mlin+9efr8//POr3lfFyVSqxQ+2NGen7yji/eO95yviO/nV/7jhi6+ttd+2r/SGjz0vruKl4sLAAAAcLgp1/2uxIaQ/n/0/ZU6obpEEwiEnQv/9cwPv3av9sGpaUqiluX37bb2geJdXTh1af7Ru8tbegpx7Wcevm4NfiXBtAQDAAAAHPr6ZFmC1RLcaOwYAoGwveHN/NR/4d3fDaLuyvE93zu/urotTfGf+5Xffd0XvdIdGgAAAAAOPcdOFk8cyxdnNTAWgUDY4aAZevLneih5NiK/+alC7Pa83e9sKL7YJM/AWAAAAAAAALDHAlz8FQnqhxc+tyMvZev9jzg6NFcbAAAAAAAA9oRjg1OjsevzF373j3ZEgBVv7ArNPMEAAAAAAACwJ+QGizclpt/1qZ/d0aG5YyvwO97zvh/jqgMAAAAAAMDuUni7rSzAfywx/bfLT3ZUgDWwlo7zzqH3/xEXHgAAAAAAAHYVDUolKX3Xt3zvrkzQHLtBt58u9nL1AQAAAAAAYNfIDRQnJKTfNPvpXRHgr7vwiVcCPFAc4eoDAAAAAADArqH52SSk5+c/uysCLNGuzAlcFm+uPgAAAAAAAOyeAA9MzklIpz9xa1cE+Fu+57oJ8GSRqw8AAAAAAAC7J8D5qUsSUo3QvBsCPPqRaxUBPpafHOfqAwAAAAAAwK6x2+8An56cf9UCnJ8qcPUBAAAAAABg9wS4LKIS0nf/k4/u6ijQufy5Hq4+AAAAAAAA7B6Fc7myBP9nSen/9Jt/uKPy+9ml34rzAP/vXHgAAAAAAADYddrzk3ckph9dvLejAqz3jCtTIOWLC1x1AAAAAAAA2HU0IJXE9CtGZ0u/tvqfdkR+P7/yH0tdf/s7KgL85uDkEFcdAAAAAAAAdp/C223tg5MrO9kKHFt/c6fP/wIXHAAAAAAAAPaMY4NToxLU/+rrPlD63K/87rbK74/eXS694z3nKwL8xqnz/VxtAAAAAAAA2GMJLt6IXaG3a0CsO7+6WvoL7/3Qq9bfweJlrjIAAAAAAADsPRoRerD4MErwVluCP/Nzv/F62qM3Txd/lgsMAAAAAAAA+4a3Tp3rjhKs7tB6J3ijA2N94Xf/qPThhc+97vbcPlC8Gwof7ODqAgAAAAAAwP6icC4Xu0PH1mCJcLNu0f92+Unpuz71s69bfV91e56c1yBbXFQAAAAAAADYt7waGOvV6NAxvPuffLT0TbOfrozqPP2JW6Xz85+tfH7Xt3xvyW+Xyxd/JZefKnAVAQAAAAAA4GBQeLutMk9wfvJOWWj/s5fcNOQGi39cDjclzlw4AAAAAAAAOMAyfC6nVt3cQHHijcHJX6hMazQ4eU+f3xycytPVGQAAAAAAAA4dxwYm5yTA+svVAAAAAAAAAAQYAAAAAAAAAAEGAAAAAAAAQIABAAAAAAAA9o8A5waLl7kaAAAAAAAAcGjRyM+VFuDB4iJXAwAAAAAAABBgAAAAAAAAAAQYAAAAAAAAAAEGAAAAAAAAQIABAAAAAAAAEGAAAAAAAACA7aJ9oDgiAW7PT97hagAAAAAAAMChJZefKlQEeLC4xNUAAAAAAAAABBgAAAAAAAAAAYbDwrH81NljA5NzhCMcynmAXwIAAAAAIMBw6OXX8gLhiAckGHhoxsMu8i2BfEseJFB2IsBwuCsE5R+18sLpyfnS9CduEY5g0HdfEeByXuAXATw042EX+ZZAviUPEig7Dx1vDk7lbRqkB1wNBFh5QSK0/AfPCUcw6LtHgIGHZjzsIt8SyLfkQQJl5yFuAT7XY08zVrkaVGYRYASYgh0oM/itk28J5FvyIIGyEwEGKgUECnYAygx+6+RbAvmWPEgepJ6EAAOVAgIFO1Bm1IZfXvnD0k/87C+Vbt37QunXfu8ZvzF+69zrCOTbPcqDX3j8tFIWq0z+/G/+B/ITZScCjAADlQICBTtsV5nxb77w26W/8/f+QelL2tpK5c0qofPPfWnpI2//8z3N33/x+F8pvf/D37OlOL7hW8YrQf8rLsW5W5XX8x/6py1te/2n/nXlmv+rf/9b/Na513GPIg+Wpj/yfaV3/pk/+7o8VtmsMloPKeM2Wq6yY6++242Wp3uVXupJCDBQKSBQuQDKjJoy4+e/+DulL/3zX1Z611e/u/Rj//LnKi2/am1Q5UYVlr2U4O0WYFW+dut8PvqDn6pcPwSYex33KAR4o2WHhPe7Lv9AaenXf78ivZ+8cbtSTkuC94sAb7Q8RYChMpXRZueyah+cvGpf5LPtnidL6eLboUAmULmAo1NmfOM/nKhUrHzLgl+nVghJsdZLltWyKVHWZ4mylvl9/DJto9Zl/S+5U+Un6ziK81987hcrXf181+sowHH97aUvtvS70HbaXnF5AVbaYnr8tkpXeh7aTsfVPlnrY/iZz/9GZb26Kvqu5N/5vR97LbWKJ65ThVbba78sAdZxso6HAHOv4x51NPLg1w///dLg0NevWz738U9WygmVIalQqrxIu0n7Zdonhlg2xvWxfPVlWCyHGnW9zipPfVnuyz2f3lbiJg8e8sJ8382RReagQCZQuYAjU2aoEvSOt96q21VXlaVYSVGrxN84dboSVJH5W2f+bkVOT57+m+u6xcVl2ufLvvwvlUa+6Vsrx5FMH2vPla7+yE++3l7/a7m6XCtoe1WgogC/p/De18t1XMWdVqy8eGp7HUPb/+Wev1pJb1YXaJ3XX3/3qUq6tEwtLtouCriWfeu5C5W0qXVc67/9g99ZI869X/Wuyvq4vz7rmsXW3xhU2VO83/yPi5XttL3SqLQqzVGA43XS+cYWIH7r3Ou4Rx2tPDhenK6UAV5Io1z6ss8LsMrFtLeMX6ayTVKth53a70Pf/dHK+uFv+OZKWRmXazu16vry+tM377TUBTotyxXnD3/mp2vSq+Mpbh1TcfsyjjxIC3ALrcBVYaUFmMoslQIqFxTssJkyQy2OqpR84lM/3nK3PEmcWi8VWhFgxS+RVMVNEihxlpjG46sSpPfdopCrgtTzFV/5WkJVkfrJu79c+SwxbpRetVgr7th6+s8++ZnXlbq0wqZKnraNLdISWp1frLDFY8dWZ7V6K62KU58l1hLYKMxqCdH2qlhmdYFWRU8Vv3gu2l4VRJ17FGBdm/jA4dsuzFSOFyu8CDD3Ou5RRyMPqvzSwzSVCforIZZcpr1nNirA2l7lksRax9B6lTExjlhmqVxTOaSyTdvoczMBVpwqP2P5p331wFDxx1c74vnE8vljP/QjlWXxgSd5EJoSBZgrQWWWSgGVCwp22GyZIRkLLb6XFStHvttaqwLs9/FiKAmVNPpuzxJDL6ESwVbfC5ZgXpr/oZplavWoJ8BqrZBMx4qlr2BquyjmMUjOJan6X138fPc/7auW4pi2VIDV2qwHAT4+SbXiiQLsK4JaHtx7wQgw9zruUUcnD+rBlwRRZU5snVV5pW7QmxVgyWe6Xt2t4+f4QFTvG7cy0JVfJ9mNDzZjULmutOt1kJje9OGl0pSWi+RBQICBSgGBgh12rMzQk3hVSnylaiODOrUqwPXiUcUn3b+Z7NYTYMlolsyrxTpLgCWsktlgI6wqHboOvgu076od94+VPEm9uo6rdUQt1opDrR31BFjx1evulzUIVqyMIsDc67hHkQf1sDKO1B97kWxUgNOyVp9j2ejLHF+GtirAWfGnx1Dc6TgOeu0j631n8iAgwEClgEDBDjtWZkjo1HU4K3/FkUfV3bmeAKsrsF8mKWxVgNW6q1bTtNUgthhvRID17m3aehG7RTeaBknirDSpchns3bh4nNjdOYaYXqVRLRdf9de+uiK1armVUOtaNBLgGLcfREZxIcDc67hHkQd9b5G0HItlo1qB44O0ZgKsePZagH3PF8Wtni3pgF9+ZGvyICDAQKWAQMEOO15mqCuwWi7TiokqW6q8xBbPegKswUz8MrWItirA6uKnY/su0qr4BRvpdCMCHGU+7TItUc0SYHXLS+NRi3Ds4hwHwfLrJb9apgcCSqMfHEYCrMppHFAsPXdV8mLcXs51rRDg3bvXxRFo09FrCdyj9kt9Sz1K1CrqXw2JZYIfpyAVYC+z6kKtV0J2S4DjGAe+LNdvTeV77GGkuGN36JjG3ZhvnnrS4RLgZxUB7j/XydWgMnuYBTgOepNWHH23wTSoQFUlNb7Pl1WoU7kAyoyq6KrlUpUXvcclcVNlRuKoZfG91CyZjb9BSZ/+j6OXtirAqgDpONpe4qsux6r8xUrZRgVYLbaqIKqSpfQonji6c1phk3xrnSpf2laf/TvEcaRmH5fWqzxR2aL/tSxOoyTxj8u0vyqpsUVZ2+h93ziStLbXNdZnnTcCvPP3OuVjtdj7e4Xymm9pq9eKReAetZv1LeXJOKq8yg+VmSpjVbaqrI5i7Os1KldU/mhb7R9HfN4tAZb46v/Yeq2gB4b6jcWB/BS30qSyVg8PVa/TA9Sdng6JetLhEuBVfZm5/LkergaV2cMswHp/TwVqWjn0le9YgY1Bn3XziN06EWCAxmWGKlT63ahypUqMWlKj3PlKWZYcSBglFrH1VYOcSITr7ZMuUytBHL1ZlSVV9GIFTwPAqEKXDkSVLkslWBWvmB4NZOVHZtb+Pu0qX2LFzQ+gFUVbYqv/1VUvvnsXzyNeL52Pzlv7xwqlKn06L12b+C5xFGXto33jcsWrOPzcv3GU1rgMAd78vU4PLCQP+g7j1DLK2/qshxxxTmYEmHvUfqlvKZ/q/ViViSovVI6oLPMD9SmvxjJJy1XuanuJs1pdozxrvf6P5bKfbsm/lhHLHF/OpWVmo2mQ0rJc8cc5i2N6Y/mv/RTvbvTEoJ6EAAOVggMVYhceVWhVmPo5OL0AZ4mtWoC1LwIMcLQemm1XUAWtkWjzWz84+TbeK6LopveYKAFegCUU6UNXLYsVdu0b16t1WRV9v17HUqt/bP3SQx1tl87tWu/ep21jenWcGI/iT6fDyVqmfXTe/qFKfFe+lWWKT+n3MoQAU3Y2EmDqSYAAAwXyNgRVPlU50Y1fFRQ9wfeTwDcSYLUi6ck+AgxAJQ4BPtr5Vq29ugeowp6+V+m7X3oBrtd9P1b44/1HLV76G/OLunSq5U7vg+v+pc9q9dL6OJ2N1jfq/qp91YoW4/L3r6x86ZdJXPW+ue5/Wh57Q8XzzmrlTpfFcQF0fKVFPSo221KHAB/OEFtyd3oEZ8pOQIDhyBXI/v0U3Xx1I/ejstYTYD1h140/Tt6OAANQidtoUPe8rJFY+a0fzHyrHkTBxoiQIEry0hbhzQiw3mNUPGopjfvo1Z04mrmkVyKs1tT47nlWa3SUcT+QmuJQN+2NCHDsghqFVfc/iWyc07qZAOvddd1r4/H00FnnmI7WjgAf3aA8oV55yhN+7nLqSYAAAwXyFkMcZdVLq4TWT7kSKyCqYKgCoKDKQ7DBTWL3NAQYgEocv3XyrSRV74X7wbAkw7H78GYEOIqt38e3lio+SWyjgYZi0Hvkann1PZ3S7RsJsPbT/ul6P391MwGW7KbT0miE+JAxhysCTKDshN0W4MeVqZBOF3u5GlRmD2OBHJ/W66Ycg27yWhbfoYoVkDhyrYKerqfTuSDAAFTi+K2Tb9PWVg1aptbZON3VZgTYvyectU8rI+02e6eyVQGOcfuHwgpq9Y7paibA2l7XxO+vFuTN3kMRYAJlJ2ynAC+9agGeKnA1qMwetgJZ3b50w1WLryoEPsQpjpq9A4wAA1CJ47dOvq1cu498X42EpiPhZrWO7oUAq1u25HWjAqx9vADrVSH9n4ZWBFi9p9SFO2t/3zKNABMoOwEBBgrkbQxx/sys7lZxdGd1WUOAKdiBMoNKHPm2WYiDOmWNwKwuv3G8CC+C8V1dL326/+ykAMd57/29L3Y/9gLs58FWd2utj1Ksh8TxHWJ//pJaP7WgX693OeN5a9AtdRFP06VrtJmBsBDg9e/PxjyVjtxNqG0IiQ9dlO+2Mlcw9SQEGKgUHIig94/qDbihd7h0s1fXNQSYgh2OTplx1OdoRYA3n29ViZbUxe7OmiP1uy7/QCU/SYzjazM+j+m+ocGgJIS6d8SZCHZSgKOQqxVWc0Qr6H+/vQZnU4uv3hfWesms0hUFWLKrdH/n936sso//HOfJVnz6/Ombdypp03WJ562HBPqs89b6mIbNjvaLANcGvQ+uMU6Un/Qd7seyZj/Ul/zvJH3oQ9mJACPAVGYPpQDrRqun7/XW68asbmuS4XTS9qyQNbk7lWKgzECA+a0fnXyr1jZ1hZYwqkKtbs+6l/hWYUmJ7i2+N1LcXqMrSwgloPFhrPKjnz83Tg2TdrGO8wy3cj9SOjVQVxxlV6LuhUT7x5GetV5p1DH8iOWS3DhuhtKvB8b+GEpP71e9q3IMiYUeCPjzVtr0IFr7azulZ7OtlQjw+vqNWjM1oOdmBhU7KgKs/KaHBUqHfrcIMCDAcOgFmEDBDke3zFj69d+vVHrS7qpegFU58i1v6TK1+MX/1X1TccaudHGUeY3eG7siqrudtsvqIstvnXy7X1rCuEcd/DzoWzXT99IlxFrnu/vqf5Vf+qsySmWWPiuk5WZcFveJDzPiflmSqXIwfRgT0xhfNUvL2nr5VOWoylCVr7ELs593O10WuzjHdPipwbRM5b3+qtu+Hj5RdgICDAgwgYIdDl2ZoXcX1SU1TmmmVq5YKWplgKK4LHZPVUuZ/mpQvVjpVKuf4lY3Ty1XxUrHUbdSbav1/NbJtwgw+XYn8mAUXElpbAHWd6zW/Dj6tspAtfzHkcHVEhpH4tasFyoLU3n2y7SPWvBVXqqsU3zqJu9nyFD8Wq54tY1eEYi9GXQcxaX1sVxUWdpM7OPsHQrx3XUvzzEvx2X6X68k6Pjx/GIPC4lxvD5bfTBJPekQkRss3qx8mfmps1wNKrMIMAJMwQ4HvcyIc3/HSpqe/KtSGCt1mxFgvU+pSpRaOOIytSaoBULxq9KlSmeUC72TFzY53ym/de51OxEO+is8CHDzoO9XXdVjy298T1viJ5nV/3qXW+WS8kMrAhz3iS3C6soe56OOZaGO48vaOP+z1kmIY48ZdZEPbgrKegKsLvXKpyrDU9mtJ8D+IWcsf7f7YQ/1pMN0MxgsLlZagAeKE1wNKrMIMAJMwQ6HRYDVChwrXr4r4GYE2Hebi8t8NztV+GKlcL+3tiHA3Ou4Rx2+PBhH8U7LHMmgZFcym06N1YoAq8U37V0jQY0jgafvqktuYxqCDTTquy5rmQZEayTAUbizZLeeAMfB2Xw86TRf5EFAgIFKAYGCHQ5tmaHBTtTtLrYmqNIW32XbjAD7yldc1qgiiQCTbwnk293Mg1lllQ+S2ax5m5sJcByt3McTl6Ujk2fJbPrObRRTibniiUEDpGWJa6sCnMouAgwIMFApIFCww5ErM9QdTyPbxnfD4pRoCDACzL2Oe9Rhy4Nx7udUgGPvl1YFWPM0tyrA2jYd68DPT5xVBkYxVRdnxRVDbBWuJ8C+23Ts5YMAAwIMVAoIFOxAmWEVQVXM/Kih8d2zVIDjO3J+ZFO1RCDA5FsC+fYg5UE98FOvFy99KgP18E/dkOsJsMpKv73epW1VgNWzRtv7slbdl2O36UYC3KjV2K+PXbvT6bkQYNgS5S/y1/VllsPt9vzUNa4IlVlutFQu+EXAQS4z9L6bBqRSJU6VL1Wc1PqrgaxSAVbl6kva2iqtGNpW85qqwogAk28J5NuDlgf18E7v+UoQVfZoJGQN0KdW4CwB1gjOKv8krSontb32b1WAVdZKdmNZq+Pqc5yvejsEWEHH03zHSqPWaSAuBBg2zZuDU8fbB4p/auH/rYjwQHGEK0NllkDlAuAglxkaPVSDUqnipHeAx4vTlRYSrVPlTJ/jtuomrZFTta2m6FAlK1YU1U1P/8dpPfwyfzzFGSt9+33EXQSYex33qMOZB9USK6nVyMsqzyS0cbA+yaAv9+L2ElqVkZJKlWHaLpZl+j9OJ+RfEfHLFL8+63g6bpx2Kb4jnJaBWuZbc7NGsk7XKw49wNQx1GKdlstZ+zQ7DmXnkW79nbpa6f5cmQpp6qK1BD8J/ec6uTpUCghULgAoM/itk28J5FvyIIF60uGgLLnlL/GZvsg3Tp3vD4W328r/338lwZO3uEBUCggU7ACUGfzWybcE8i15kEA96XDcBPLF2VeyO3UvLsvlz/WUlz2vfLmDk2NcJSoFBAp2AMoMfuvkWwL5ljxIHqSedLApnMuVv8C1V+/8nh/2q8pCPG1doZ++depcNxeLSgGBgh2gXplxenK+kncIByfoOzvqAky+Jd+SBwmUnUcMTXlkkructb59oHi3sj4/eYerRaWAQMEOkHGfuGD3EcJBDeXvkHxLIN+SBwmUnUfjBjA4uVKp6OYnx7PWV0aHtveDmR+YSgGBgh2gXrmhByaEgxeO8u+cfEu+JQ8SKDuPWkvf4NTo69GeC2+3tdBK/EzvBnPlqBQQKNgBAAAAAA6W5AwWl0xsZ5pvO3nLtl3iygEAAAAAAMCB4c3BqXxs1Q2FD3Y02/6dX/O+Lg2GZaNFT3MFAQAAAAAA4EBQFtnblfd6ByfnW91H0yGZND8/dvp9fVxFAAAAAAAA2N/ye7rYW5bYl+XwYqPTGx0bLC6+mhu4+KDRe8MAAAAAAAAAey/A+alrNsLr9Q3v3H+uU4NmWVfoi1xNAAAAAAAA2JeoxVctv5VW3E12Y24fOD9sXaFfvnHqfD9XFQAAAAAAAPYdlelNXsnr7a3E054vLlg8y3SFBgAAAAAAgP1F4VxOoz5LXN8cnBzaWlwf7CjHs/pqIK3iZS4uAAAAAAAA7Bs03+/rAay2AUm0Dab1UtMqcYUBAAAAAABg7ym83VYW1cevBHhqdBul+sqrrtCTK2ph5kIDAAAAAADAnnIsP3XW3tl9vL1ifS7Xni8+slGhr3KlAQAAAAAAYE/RYFU29dGF7Y5bI0FbV+hSLj9V4GoDAAAAAADAniAptdbftZ3qpuxGl17VAFlcdQAAAAAAANh12geKdyvv/uanLu3YQQpvt2lwrcqI0EyLBAAAAAAAALuNdU9Wy+yL0H+uc0cPhvgCAAAAAAAcKrrKQS2pd8phqRwWyyGdU1fL+uz/2XIobuPx2ywNzVhQGt4cnDreni8u5AYn53foeozaOWbRZ9eia4++K30vV8iyAAAAAAAAmxOqZ+WwUg4SyjkT4VI5zLjt9Llg/0dJ3i7ulcNEk23GbbvdYM7OMYuCXYuePfq+dJ1WybYAAAAAAAAbQ92Hn5bD7fCqFTaVwJfl0J8hwNvNahMB1iBXa+WQR4ARYGiOvSYwwwjmAAAAAABVZk1yu+pI50IdAU67QEsGr5k0qvX4rFsXu+yeLIdbto227bb1Wve8HO6H+t2OJX1xrl+J+vVEhofDqxbpXCKxo/a/tr3h0jeSpE/HvWDrL2YI8FCodgGPAjzqzkfn4EeJVhqny+GuW+/fVY7XY96l6UxyziP2YGLJ0t6XCPCZUO2ynh4fjjhxBHP95WoAAAAAALxCAvWgxW3rdYGW/K6ZDI6Y+D03kYzCps/qYj1j67V97M48Fl61Ql83kc1CInnVfb5nEh25naRPMvjCxLVgkn/NpPWyfb7g0rdmgr1oy70AD1n6Y3fwKMDPbNsxO7f7Lj03LM4JO+aSbRMFXQL7xNI0Yd+D0nTCpemlpVXX5KYdr9vWvbD4pi1dz+36ASDAALAp6DkChwnlY90Dyc9AHoSU2Lq4FQGWxD1Mti2alOVM2EqhdlCtaRO84ISwURfo56G2xXkm1LYIR8G+nEh1MDG9lcR3yYTSp6/PrY8CnMqvF2Dfyt1ry9Qq22//+xbqDkvPBXe+N/1vxKQ2XoMn7lziOd6zBwwxvb1JeukWDQgwAFBuAJCfgTwITQT4zhYFWOL5wCQshgUngVHY/DvGcVkrAtzl5DIVzh47hoTxYqi2ZittsUX0ZVg/YvUJ2/+kHfdpsn7O4nxuaWvLEOC0y/Gq7Tdj6+eSsOqu2Woi1f4adGecb0iu3VrGMgQYKHQBgHIDgPwM5EFowLUm4jRtkthIgLX/sn1OQ1+G7G5UgHtC9gBcj0K1u7KO1W+yG1tbR1y6JxrEmSWPc7ZerbDP7HMqwCmPnew+r3M9ig3ONy6rd76NZBcBBgpdAKDcACA/A3kQmjAc6rc29ppQTjcRYHV/Tt8/7bI4O7ZBgHO27ViyXHIaB4mK+z51Ahrft5XAXqxz3t0NBPi+ewjgR8OOAtzjtm8L1XeCx52Ie4ZCtZt1IwHusP3T871kyxBgoNAFAMoNAPIzkAdhk+jd0rVQOwCVugivmFR1NBHgOAjTCbf/oslobgMCPNMgjY9NAD15O+6LUB1R+qZ99u/8XrX4j9tnnc8DJ7j1BNiPAq1tl010owB76Z+1tHSb/EuGFxL5femkt5EABxP7++7a99l5jbYowGOh9p1roNAFAKDcAPIzAHkQTLJuherIxmv2v1p2/UBL9QS4zf5/aWL52OIZqiO7WcviKM7LddIoib2bsXzNRD2Ndzw5v7smqEsm5svu3FoR4Cigc06Ab9mxH1ncvsV22K7BY7smLxNhbibA3ZbGpybCOvaVBulNl/n3jeEoFrqDU6Ptg1NXGXkQAKisAfkZgDwI2fSEVy2MkscTddbnnKClcwf3mgQOh9ruvx2htrtw1rI2E+b+OmnrNwlMj9kdqq2/wdLXE2oHrYronDRy88mMtBxPlnUm8cZjHXfHCJbm0ZA9j3KHXYux5EFCsHg6mizTOeQtzb1N0psuGwm100YBAABQWQPyMwB5EA4QaiW+yGVoiVuBLtAAALCRyho9R+AQwRysQB6Ew0BPeNWluJNL0ZRuLgEAAAAAAMDBRq2avVwGAAAAAAAAAAAAAAAAAAAAOBq8cep8f/tgcYb3TgAAAAAAAOBQw8iDAAAAAAD7g6IFoXd6F/dJWraL4y1udyHUzlcMgAADwJ5BzxE4TDACL5AHYT+x6KR3ohxK+yQt24GmH2pVODRS89oGhBkAAQYAyg0A8jOQB+EAC/BhS8vqBgRYXNlH1wIodAGAcoNyA8jPAORB2ARt4VUX37vlsGSi15UhnRvtAq14p+vEOxvWd2f2y0bt/znbd3wTAtxRDpds/3sWf5s71vNyWLZ0xfTOJOn18xifKIeXgXl7gUIXACg3AMjPQB6EA8v1cnhqsjpSDg9NDNvC1rpAK941i3fU4n1o65YyZNYvU+Z7Ug6PyuFGOYxtUICV9vt2vLMWVsrhjq0ftnO+bXFH2V+zhwFjduwHSbxPbD0AhS4AUG4AkJ+BPAgHjOMmtaNuWa+JX+8WBDjGO+KW9Vm8PS0KsFpbfQvsRgRYaX0Rqi3O8byUpiH77LtAx3VnMtLr3/u9Y0IOQKELAJQbAORnIA/CAWPUxC9XZ/1mBXjMtm2rs74VAV5pkJZmqPX5icXjg7o9z2YI8Nkm6fVpWCLbwLYWuoNTo+2DU1cZeRAAqKwB+RmAPAg7SzOp3awAN9u2FQFe2oIAx+7MixlhNEOAWz03BBgAAKisAZCfgTwIB5QhE790ep9r5dC/BQE+Y9umA0Zdt3j17m3alfjBNgrw1XJ4nLF82J2rF+BhS6/vMh3fgT7hlinNd8k2AACwp5U1eo7AIYI5WIE8CLv6fYdXXYWvuWUS3Zcmio0EeNhCvXjXMuJ9YfEumIB22LqCHXMjAjxhMp1Fv6V1Itm+5PbxI0DH9F7JSK+XeA2qNU+2gQ1XVvNTZ1WwbjqU9+cqAlB2UH4AAABsnSGTP7WYPjDpK2ZIZyrAS6Fxd2DF+9TifWjxjtu6PjvmMxNRyfCNDQpwKTSex3fajvnIji/BnnHrFyyOtQbpHXPbd1gcBbIMbLQCq241Ww1UYgEoOyg/AAAAtge1gKrbst6P9S2eXaHaLVgC2OPWSWLvtBDvsMXblaxTfCN2XG3X6bbpDOu7T3clcUjSLzY5fpcdQ8dPu3mri3Pegk9TvfRK3lfIKrDhSqy9V/LeD3y8dPn6/7jhoP14LwWAsoPyAwAAYG+ZD9UW3b1ALcQndvF4ah2f4GuHzVZiVRndDNqPCiwAZQflBwAAwN7SfYSOP2wCDIAAAwACDAAAAIeaQljfhRoAAQYABBhgizACL5AHAQCoxFKBBaDsQIDhSOV18imQBwEAqMRSgQWg7ECAAfkAIA8CACDAAEDZQfkByAcAeRAAAAEGAASY8gOQDwDyIAAAAgwACDAA8gFAHgQAQIABAAEGQD6APAiwW7xx6nx/ORPOMBQ5UImlAgtA2YEAA/IBQB4EMiEAAgwAlB2UH3DgYQ5WIA8CN30EGKjEUoEFoOxAgAEAAA7NjT0/dVY35KxQvlkv6Yatv/W20f5cRUCAAYCyg/IDAABg38uvCe6WAhIMCDAAUHZQfgAAAByIm/p7P/Dxys15o0H7cUMHBBgAKDsoPwAAABACAPI7ACDAlB8AAAAIAQD5HQAQYID9AiPwAnkQuKlzQwfyO/kdgLIDAYYjldfJp0AeBG7q3NCB/E5+B6DsQIAB+QAgDwJCQCYF8jsAUHZQfgDyAUAeBIQAgPwOAAgw5QcgHwDkQUAIAMjvAIAAAyAfAORBQAgAyO8AgAADIB9AHgRACADI7wCAAAMgH0AeBEAIAMjvAIAAA2wQ5mAF8iBwU+eGDnuRL/OT48fyU5faTxd7ye8AgAADAAAAQgCHPl9WQr74G9slw+R3AECAAQAAuKkjBLB/Bbg2/PpWZJj8DgAIMAAAADf1bROC2G+fQNhKKOeppToC7MPyRmUYAQYABBgAAICb+rYJQYOWOwJhB8PUvVZEGAHOpKccTpZDxwFIa64c+svhRDm0UYIDAgwAAAB7KsC0ABN2qwX42GDx/2wfKF7PnSqeCYW32/Yivx9wRsrhcTk8K4fVcnhRDld3UCzHymF4k/sqTZfK4Xk5PCmHp+WwVg6j25Q2CfV0i9sulsNufP9L5TCxx3lkzs6XeyUCDEcERuAF8iBwU+eGDnuYL9dJb774RxuVXvJ7JgUT3olEAtdMNHeC1S0I3bzJ+km3THG9LIf8LoteX3jVao4Ac6/kfgmHNq+TT4E8CNzUuaHDHgnwscHi/7UV6SW/Z/KgHK5kLB9zy3tMwBQWyuG4LVer6zVbdjLZXzJ6NVRbSf0+amm+bfItupxgXQz1u2B3m+ieyVintJ51n/vt+NeT5Z3lMGOSv2DhhNtHsrnshLPL0rRo2/pjj7pzGLVrMGPbqhW5LTnupTrnOGP76lqO1xFgxTdr5zOWrFf6L1vc8ybmwX138+64nUma4rldStYFS0s8l8tNBLhg10fnMJIcX9dyyNbpe+o9DGUSAgzIBwB5EBBgbuiw7bQPTk1vl/SS3zMpOYlrJDeS1vsmYFFY1RJbNIFTV+TYrfmMfZ4x+bxTDo9s3ZCtu27CqbjWTJ4kXDftOFnf9VlLRzNGbLtZk68Viz8K2XOTygsmZc9NrntNzO/bubRZuhft2JdCbUuz7wKt/5+YKCreVRPPKJorLp5Fizdn61ddGot1BPiZHb9ox5m1db1uXYz7mcWds20vue/hnu2Xs2PetOt+3T5HMV+wNE6YtD5vIMAX7DucsfT53gMF+77v2rpblqYcAsz9EpAPAPIgIMAA5Pe9EOCeFgT4hZOWDvt8MpGg+05AfStlrx0nOOGLLayXTY4ibSbWIxnpmLB9m/HQ0pMev8eC/j/u1q+5hwC+q2+3pc9z36U9FeDryfVYsv8vumsTWQ7V1t5V26Yeiueq+zxsUhlMxovJ9YvnetyEvc+JePxeiu6hROSBLe9I9gsmyvUE+GnyfZ2x/NFh1/W5yzu5FvMcAgyAfAB5kDwICAEA+X1HBPhkCwLsxXPI9ltyYdmkJ6IWR7UiqtXxSQMBvmOffVzPQvbgUmed+DU7pxPJslU7j54kLX5dKsAhVLsX37RzfNlAgOcSWV9y69aSc1xz2/vj1xNg/w5wRyKRwybIt+3hgV933T6rdfeKk9rrddJ0zX2/not1BDhez84630Eh46EFAsz9EpAPAPIgIAQA5Pc9QWI0m7FcUhW76aYSkw+1Lao+iDhQ1bRt29dAgG+bKKfxdGakKbbk9mWsi+/zhrC+dTqEaivvRgT4hMWl81ELZ3cioxsR4MUG57hRAe6yc+iy5WsmqIUMORbHbTu1tMfu3hLdWxlp6rJr16oAd9u23W6Zb+VFgLlfAvIBQB4EhGCX6QkH+H0zIL/vMOqq+zSRSonZQyc8qcTo96RWWt/NWbJ70/5fDrVTCV1IhOqxE7pZ277Nxf0g1J8m6baJnB9E6qSJakyP3nP1A3sN2frODQrwjF0Hf12ebUKAi3bOMc06V3WJHt2AAN9IrvWK/X8zOdeCE8x+S3+bO+5zeyhx1sTZp+meXcNcWN+t+V6o3wV6Jfm+Y0t9GwKMAAPyAUAeBIRgd1ClLg5uo8qWui2qtaN7h47XFbZvHtK9fFBQ2sD5XiC/H5pCecEE8Y4J1ZoJT0cdAY6C98z2vW6/tWEnkYrjsq1bCrXv3cauuvF90/smanP2dynUn4O42wR5zdJ6J1Rbab0QP3Vy+NQJWjMBnrFzUflxwv6/bvEvW7i8QQFus/8f2b4P7JxzGxDgeL4Ldt3PuOM8t/QtWNxPbX0U7QeWtiV3bdvsQYJP06NQbZWOo3Vfse3WGgjwsG173aVvtEHeQYARYDgAMAcrkAcBAT44N/Q2q0SrYhyn2zhuFfoHO3TMwzBH5kYEeM5V7snvhwP9VsZDdcoaj6QoXyfPTNh+x5N1Z2xdFLW8PTiJ8amVsN/9Zkds+5EG8usphOrUTFnT6sRjTCSylcuQzbwTv5iWkeQcz4ZqC3J8v9jPA5zOCdztzi/Ge6bOOfrjZ9Fv8cVrdDwj/T7efrdNs2vr05TLyBPxO+wJ2V3P/fmOZ+SFrLxTCIwCjQADAAAgBNuGKmC+a5+voD10ldQJq8hechV+VdBnTPDSUWhzto/WzbrKreKNU6eMJZU8bXsxNG95HrJ0zCaV+X5bN27xZFVQ0zlBJ9y5j1lldMbiP5Gx/6zF3Z8IcLPzXUmOPbSB8yW/AwACTPkBAACAEGwD6up8o4Xt4sio6lY4bTIYR0HVZ3UHjN0q43ygilvdNtXV76UJpYQ6joI7Y9vHQYD0WaOzPgnZrVQhVLuLXrT90q6k2lct13czBDhrWhjfvTDOLxrl+lmotn6dsM/ztv6xE+DYin7bznfBzrffne+qO9/L7rPiS98pJb8DAPdKyg8AAACEYAdYCtlTqGQJsH+P9YbJb6TbpO+4hWuhtvvgg1AdDMd3gY5zb3rhna8j5Z22rR+x9mKozs8ZBbhel9BWBHg2ifueO98rSVwldw7Xm5zvUoPzjdPGHPr8/sbA1LXcQHFCoX2geEHx+pAbnJw/NlhcTEN527vl/ZfqhNt+29xg8XIlroHJ4rHBybE3B6fyb506102pBYAAAwAAAAKsltKrLQpwwX1WC+j9UJ2yREGtsWNOiKctbknkizoCPGb7+XjuW/wpOn46r6mfMqbZu7atCPCJ5HjP3fn6Lsw9obYLdLPzjekasXXp+a4ekfz+y/q7R+F5OdxvH5y6WhbqkVA4x2jnAAgwAAAAHDEBVuvjwzrrlpz0ZgnwZVvmg0Sw10mtugT3h9q5Ob0Ax+lF0njy+0SAn7UgwP581Up+MuN8Y7pG7RxaOd9Dl9/L4nnbtepeT1uAj+WLs7GF2If2gfPDGtUwKxwbnBqtbjtZfNWSXLxcOUZ+8k57vviofOxnGUL8tPL7K3ywgxINAAEG2AqMwAvkQeCmfnBu6JK3Fyaingsmdd11BPhGqB3JWd2T71l8FxOp7gi184HqnG+645dC7Tuwakmdz0hrp6XVy2LaBbqRAA+bbEdOZgjwdPJw4LY7X9/l+6wT4OmM833qzncmrO8C7Ue81UOCq+T3neWdX/O+roosD07OmxRHEV7O5c/17JNL3R2aj3IMgAAD7NO8Tj4F8iBwUz8YN/QxE8u7JpF3Q2135iwB7jPJu2GC99DJYt7im3Ny+NhkVYyH6pyZwf7G92+v2LELddI6axLrtx1uUYA7Lc23TLAfWjq8AMf5WOdtXb8T9Tjo1yXbNgpwf3K+sQv3JXd9nzvJVdxP3Dm8cOdAft8l9IS0fXByxSR4bY8lWL+ZZcsnq6HaTX47WqdzdR4oZVEIu9Mdv8d+P2l44h4c7Uc2ci0BAQbkA4A8CNzU9/EN/bjJ25wJbTpo0ETGsm63jyQvnavzkkmvKrsnndS2mQTPJBXvOIVQb5O0Drm402mQmolkj+0Xpx8ac5Khiv+opetiWD9/aLfbtyepqPcnaepPzvdscr71pnIiv+8mhQ922ABbpdxg8WEovN22B6noM/Gddb8h5T2NSH59G2WzFerNYbxTAuwfOrTZNXiZ8dvbL2zkWgICDMgHAHkQuKlzQ9/XrIb6Lc/k98Oa3/vPdZbTtlpJX37q0h6k4GbIHgVcefFGIqd6wLJoD4u63Lo4T/dsqL57H2X6qknbXKh2rdaDngXb9qJ7CNTjHtTEhzx6WHPN4kmn6xq1dYrrZJL2UYv7Sljfkp0lwJG0t0ne4tdxRjLimbd1Q5b2eI4zSfwxTem+8d19//DjhJ1vui69lh3uO7lc53woOxBgQD4AyIPATZ0bOgJMft8/5E4Vz8Su0HswOrS62o832UaiFefhHjfhU5f82CtDXf8fh2o3/PiaQDBBK5nMdtjyFfusoK7X150krrr/9crAPRPqm/Y5Xp/LdsyiyabW+dcRdF63w/opwuoJcJulXd2/YwtwHCRvxo7zOFTf0++2dfMmxg9s3546v2c/+F5fqM7rPW7nGB9CHLdzmbHjPwjV9//Ta3nHHlKcNdF/Gran2zplB/dLQD4AyIOAEACQ33dQggeLD22k6gu7fOhSCw9eJH+PkmV3TUKjAF9JZO9OIps+riH3eSJU351PBVhC2ekEVfH0h+qAdL7VV9ftvjv+4wbnE9OUhkehtpX3cah91SBv4toWquMV1JPqRgK8GGq7l0vq1Q39hF2bJ+7hQo8T+/RarobaAQTPBgYwQ4AB+QAgDwI3dW7oQH7f7/n9WH5y3AT47i4fOh1wLotroXbU9ZAI4FIiil5qU2nLmaxet22eNRDg1TqyPmT/L7mwbFIc03a7BQEesv/HTDovJOksWbzxGPed5Mau4CER0lYEeNnk2qc/zt3dZtdVx3loDxm661zLC7bfmsVdoLRAgAH54GoAeRC4qXNDB/L7vs/vb506123doJ/v8mBY90LtFFuRPpM4yZfePb2RrPfTdG1EgO/aOnX9VWtuMVRbblsV4LwT0TSkstlIgHvcsmFbFltbY4vzmYxjtJnAX0nifdJAgK+6NElsL2XE67sva3A6dbd+YPG2hexBsLTPWUvPy7DPR3RHgAF2BuZgBfIgcFPf/zf0rrB+VGeAI/3AJ06L9MbA5MldPKy6/KoV0XdLVuvnHSex8V3YDieHasWc3YQAl5JjLdSR3kYCHOf29i3XksWbWxDgYBL5xJ3ncqhOJxbTtGznL3FfCdX3i9N5vVdC9d3qNpPeRSfDd5PyUNurC/RoqHYf92ntTq6lvqNHoXYUdz1IuEiJgQADAABwU98/N/Qxq+jFd+5Ww/qRVbci1aMtbtusgrxdzIX17xlKJG7v8wcA3aF5t1jy+3YLcH7yjnWDHtnlQ18yCVZr8A37XS67PCqBu2XCpZbfByZbHS0IsLZ5bgLYZ+K3HKrdlLXd0w0KcDzGMxPo62H9nNybEeBO+30u2Of4zq/E+or9P+2uyZJdi3k7Jx/nJTuvRdtmyaWp28rB+3Y9V+z6xjSshOo71stuv/ju80MT3ziH+bx9b08CDxYRYAAAAG7q++aGPh6q7xu2hWoryouwPe+ubURq1fVyaJcE+EGo7ebYbxXfe/s4i+3WAwIE2AvwQPF6ZU7ggeLEHhxeow+fNbE8E9aPnBxs+YSJZlvye+pOHqD0u899tp8ELmdlgD6ftHgKttzPA5w1J3Ah1A7y1GPxjIfauXt7wvopkzw5d8yU3qRs6HbX5USyrdI+EqrzlKdSXbB18fr0JWkYddfb0+GuUbrOX8tgaZ2w7RkACwEGAADgpr5PbuiqKK6Z8KaoO+DFpMJ50SRsJKkUqqLXZesvuQqp9rltYjnmjjlm8VxKKrVegIfs84htW0wq921WAY7rfKV52CrMsyG7xVT7LGUsHwnr3+U7Y9tfDOtbcU7YOUyH2tbZ7lDb8hZsXXdyrrPJ9Qru3OdsfX+Da0l+3w0BzhcX9mgkaNge6s0tDAgwAAAAHDEhiIPWNGuhkISp2+A1kz2NlBqnC+kJ1ZFR1eVPLZTPQ7VlNY4EO2PbqwuhWlklE+oq+DJUW1PSKUlit2R1OVSXwgUnv/dMBhWPuimuhNqun49t3/kWBbjNjvnQLbsSqnOM6th+MB2l+ZmT2MehtptoKtJ+8J1R2/dSqHbJHHGi/MSu1yXbbqjOtSS/78Z5DhYX97AFGLaOfnvHuQwIMAAAACAEZzNELYtbTj6DVSZfmBhHAS649XoncSJDanP2f2cS91wdAfaSOuYEc9Qk0bf63g/V9wCXQvYIul6AX1h8MTwzuYzdIXtNzn3FecGJfzqwzewGBPhJWD9P6Ir9fy3UzkU6FqqtwHSB3gPKaby9R+8AA3CvRIDhAMMIvEAeBG7q+++GfsZErdn0LlmDYj0wyY0C3OPWLdUR4GDyqy7Lal3VqKrPGwjwVbdfwQmmtotzbMbwyO2bDv6TJcDLFmfB9nscat8FjO9G+2Pct+OEsP4d6ZMtCvBxW3fLxXsrVFviT5qMP7F1I0m6EeDdF+CnlRbg/LkeSjkABBhgo3mdfArkQeCmvn9u6BIutXJmDTylrsULDQT44SYEOI7metviVxfsGw0EeK6BAC85gY2hbwMCnHaBvmkS3OEE+EnGMeIAQM8TAe5vUYDj9RrNiDu2aPs5RJ+F6rymCPBun+PJ4gmbB/gJJRwAAgyAfAB5EODgC8Etk0HfnbjbhG3ObZPVBfpEiwJ82/6X1D1126nleWUTAjwWauc/DZa+iS0IcKelLbY6xy7Qfj5PdbG+bP/fdf+LGZe+Prsm8Zp2WVxRmNdCdS7SeG7xGl1O1k27tM7ZAwPy+y7RPjh11bo/X9+Fw9WbZ7jDHrx0UcoeeLqSMoV7JQIMyAcAeRAQ4F3OpKqQLZu8Sf6umaDdDdWu0WrdVEvkdRO9x05UmwmwpFetpVdsm+d2nAu23YqTzlYFWOlSd+SHJog3LM09WxDgmNaXodrKu2DHnA3V+UaHnKzo87xJ61qSPnWVvmfrlM4nToDH3b6ztu+0k/vYLfyi7RfPJc6xeoX8vvO8depcdzl9zytpPFk8scOHG3Z53/8Ouix/KFzao0vh5w9Of4f+IVD6m4XqdxsH+stZeXukp0ZCgAH5ACAPAjf1vb6hx3kz49REZzK26Tb5nUvWx2mQOpIKX6+LezxURy6OUwfN2v99odq9OmsaJH/8sSTNcTql6VDbOuaPn0W/bRPqSLDvEu6nQUrj7LHzmLZzWE0eLMzY+l47Xr1pkNIu6CdDdYTooeScJ8IRHwX6jVPn+3ODxcvH8lM7J4SFt9vaB6fuver+PHlrF35/Ky5/9YRqd/6CyW/bHn7VXoD9PMDx4VekLzDdUBbpAzk9/LvKvRIBBuQDgDwICDA39INMIRFg8vs25vcove0DxT+wd3LLYeriTpzXm4NTx8vxL8V3f9/5Ne/b6a7HeuhyO8lLoyaTalV9Zg9hsloNO+zhzGLGNnrApN4C103A2pzEzpmwxl4f6UOYEdsvPmBactIbH8DMmQDP2fL4XntwD7EWLP7R5MHRhIn0goUTycOj2Ao+Gxp3/c7bOcTz96O2z9n66+78Ttj2WjbW5PesMG5xXwzVh3mLdg38Q4lul2Zdr/j6w6iVC7fdtdG6p+EId2lHgAH5ACAPAjd1bugIMPm9Jel1YbumJSq83aYuzprnV6295bhfRvndha7P4m6odoEPTqQkVfMmS2kvixCqXe3vODF7ZMuVH/We/iXbV93wbzoBjXN3+/m4e2y9lqnVuRiqc1FndYG+YPFMWFp9F+jYzX/G4nkcqnNyFyz+B7YuSn48v/hahB4M6PWG5TrX7Yxdmxnb9k6ojtIe3DlKsGM35Dh394TFe7lO3HGk+RuWxie2/YKd9xP3nfXYtlftvJWOe+4hwIoJd3/ynV/gXokAA/IBQB4EhIBMCkc4v7+W3rJ8ZkqvC28OTl6UtFbEdaB44VV6pqbjstfrBqcuat3rMFhcLIcb1sr72AlvDC+1jd4B3qVL6d8t9wLc7MFK7Hbf5oR4wWT0XiJ3XSbEJ50A+0G3lkO1m+6TUDvq+3wdAY7xRLwAr4babr8nTLI7Q3WU9K7kGhRMgrUudrOOI6K31Tl/34rbm6QnnZ88nbu716UpS4C9TMd3+f3n+B1dcQ8X4vewFqqvimSNSTAf9tGI7ggwwM7AHKxAHgRu6tzQgfyemd+Tbsd7ECZX1PqbG5gsKi27fCnTQeRaFWBtV+/95NWw/l3+dO5uP/J7lLTujPSMbEKA0zjE01DtWvwkI70FJ5cSU7Uaq1W1v8G1O2vSf9fiLDW4ri9M9JdcKIXsaeDSEdfTKcj85yVLv483tn7XE+CLIXsgPsoO7pcAAAAIMMCRyO8aeGrg/HBusHizvPxFI2Etb7NmLbmV0J6fulZJT7644Jf7dTFIciutw/mpQvvpYm8onMvt8aWUhPVuQoDVPflOskzy3hGy5+6W/I1niKuXtM6M9IxuUoD7kmNodPN8nXPyAhxMxJWem2H9dGSReZPkaYu3r4kAP3fn70OujgAvtvj5nqUljbezgQBfCtVu0pQd3C8BAAAQAq4mHOn83n+us9KtebD4IEuAJbaH6FKq5XJ4EwIc34GN787qr1oeT5o4+rmLTzixbSTAQl19/Ujj15oIcC5DgBWH7248Eqrv+TYSYKXvUah933kt1A6iFXkUat+dnm4iwGol9vOZ6zqthPXvVm9UgNVirdb1Nvc9LIdqN+4sAb6apIWyg/slAAAAQnBA8S05J10lsFFFfqtsJW5fke0IuzPFkI6jrqsvLN3j5PcGxzn9vr7c4OR87XvBOzMC9B6hrraXNiHAcd9HJmHLofouaq+JtfLZFRPluURc6wlw3mT1msW3EurPA/zMZLc/EeC8HXPRRO+Zi7+RAEdRjed0186rXivtmm13PVS7NB+vI8D9lqab7ppcbqFcaPa509L7wOJ7FGrnUV+078LnWW17lnslAgwAAIAAH/wbugal6c6oVO+kAKdzBG8EP/fwZtN4ImxsntZbJi45e0jwLDR+z5H8Xvl2ql2kc6eKZw5R0XEm1I50LGnrc3KVb2H/ibD+nd9O+11MhNpphnKhtrtx/B10J78p7aeW1y6XP9P09ITqu8PpPMDd9nBnIlmedU75UO0yrN/SsO03Ukd+6517PlQH1ypk7Ntp4jkRagcBS/HfQSuf41zqWd9DHMgrHu+4yXcuHFEQYAAAAG7q+/2GfjwRzJ5Q23pxPFS7KEYBTqf/iHKplim1dl1MKtxphXEs2daPGDts62YtHakAq5KrKUbmwvoRZH28Z5wA65h+ypm+sL7bZX+GOATbb82O12zkYB3nZSIEamm7Qn4/0txvImRweLgcalv8uVdSfsAhhRF4gTwI3NQPtgCXQrWFZj7UdjW8FKrvG8aujKP2/+1QHflVg9A8NFGMo7ZmtYJIDtUq+shEdsEEM0rwksm14r4aaltuu2zdLdv3voU2lz6/PnZl7AzV+UjnLA0v3TkKDVpTrHONTto10Dmqi2W+wXYvkmXT4QAOiIMAbyt6uHKHy3Do6bbyKHeULwICDEctr5NPgTwI3NQP5g3dv7P2wCRywn0eSQQ4iqrvAl0K1RbStlAdFTZLgNN5Su+EaqvJUqh9H88LcHxvMJKzdWdd+vzAOY3et9RxZtxDAIlrR5PrJJG+aNtezVifHiPYNVoivwMA90rKD0A+AMiDgBDsDy6FakvpmomhPneZyOZaEOBmU594AX6aLNM1ue3ivVBHKu+F2sFmhN63vVLnmI0EWGlfdud/s8k16rbt1LJ9v865Fez6IcBUYAG4VyLAgHwAkAcBAd6nmbTfxO6siWCffZa83aojtTspwBN1BFitv7MZAjy/CQHuMLnXAEKab3S4zrU5addA28Z3nuuhc/NTx8Q03CK/AwD3SsoPQD4AyIOAEOwfVhP5lACrhXR8BwS4FGpHrlWL6kwLApzVBTqK+0YFOJjQ3rI46o30rDjSgboakc77qnO7QH4HAO6VlB+AfACQBwEh2D9cDbVza0ocNVBUZx2pVUuxBrIqblKAH5lYSkD1znFHCwLsB8GSMD+w7dtaEOB+O584RZEYsrTMb+N1VNrXknPLkd8BgHsl5QcgHwDkQUAI9g+aPsi39qqFNp0qyM8D3GUSeiZkz9Xrt80S4DhdUTHUDj4Vp0GKNJoGaSysnwbJH9PPAxwsrRfd8bSvBrTq2+Zrmbf0TScPEMjvAMC9kvIDkA8A8iAgBEeIKMB7TS4c0CmKyO8AgAAD7HElgjlYgTwI3NS5oR8wAdZAXJoX+CS5m/wOAAgwAAAAIASHGXVNznEZyO8AgAADAAAAQgDkd/I7ACDAAAAA3NS5oQP5nfwOAAgwAAAAN3Vu6EB+J78DUHYgwAAAAAgBN3QgvwMAZQflBxxsGIEXyIPATZ0bOpDfye8AlB0IMBypvE4+BfIgcFPnhg7kd/I7AGUHAgzIBwB5EBACMimQ3wGAsoPyA5APAPIgIAQA5PfdZbEc+uqsmy2H0Rbi6CiHrgP8Vev8r+zyMTX/9vEWt73S4DsCBBgA+QDyIHkQEAIA8nuLlMqhUGfd1XKYaCGO5QZxHASU9tVdPubtFq+tuFkO/fwiEWAA5AOAPAgIAQD5fecEOKWzHHrtr2e1hTh6wuZbiXXM45vYL9fkuL22rhUB7rbt2zaYvjZ3HM9ShgB32bbdLZxbV4P0dNt5t9VJT4/73FEnfYAAAyAfQB4EQICB/H6kBFiSFtM+XQ5rtuxpOVy25WqdfGnrxjLiUNfdx+XwsBxWyuGWxRHqiGfJCVrcd9n2ve9ETelaTAS75D6r6/aTcnhgfxedEEoQH1mIaVptING3XVw6z7yty7v0xXOM8jph5/nI1r9011Jdml/YdZyxdMVjaJ/n5XCjzgOGVVv32LZ/7OQ7Z9+HP+8hd31WLX5dp6KFp7ZM53WdXz0CDIB8AHkQAAEG8jsC/ErYTtj/x032OjMELeVeOczb/20WZ6sCLLmbdesWnaQ1EuAuk8hhJ4b3TTaDCe+iS9PdBgJ8yWQyZ58v2uc22+dikr7bToBfhOq7uyP22V/b2AJ81kS5zV3fkhPbVIB92h+6azRn55lzx3waqi3hJXuQkbOg63vGtu20fY/zy0eAAVqFOViBPAjc1LmhA/n9sArwQxO/mbB+QKZ6AixBe+nEOcpeKwJ8wgnbhIUrJnTNBFgt0c/cfgo3TcaDyfGQ23ekgQArrRf8vdbOq9+Ol3Pr+u18owDfr5O+VICDE98zdo39g4BUgM8k0h2/o0f22Z/3CzvXePzO5OHEIxPoE/ziEWAAAABAgIH8jgC/Qq2qsTX0pf1t1gLclYhclN5WBLhg/y9mhGYCLPFby9hv1h2jN0lTPQF+HLIHqyrYMUJGGjpCtQt0KwLcayKqNNy2dDYS4EIdAV41qU3PO59x/GDf36yJ+kt7yMG7wAgwAAAAIMBAfj/SAixRmnbLu022xpsIsFCLrW+xvJAI8BO3rsOJX9oNWKjl+az9Lxm/69blneCp67NagP0gUEOh2iVa6fXvK483EOA7dqzgZPWmS58fsCoeN2xQgNWt+1aDBwetCrAeSvgu2W12vbszjp+zdTknwyuhtss5IMAAAADc1BFgIL8fOgGeD7XdZocTAc6ZqF4ykRoy0Ttp20mcLofalt7gRFWDQPWbpK46MdT2L01A+0zmXrp4JJ9qnTxh+0vwriWyWbB03HOCJ/F7ZGLZa+l94iT+oqW538LjBgKswbTWLA7FpRbaOEDVXUtjn6VhJVTfd25FgK/Z8qt2nt3uGC/d9W1VgM+6Bw4x3ieh9h1gj877iq3L23kO88tHgAEAAAABBvL7Yc3vSxnhqq3z8wCfNDFbNVk76+KI7/VeqHOMWRNSbbOQiOGECfJyqL6rG1tVOywNccTm+VDbqhvjvW/i5uPtNgGOozRP10nTfUv3zQbX6KzJ94qlpyNJ34o7RpsT9KtJenz6RuzzRVt30z0cGDE5jjLq5wFO5wSeDbVdtGNaV23b3jrHD7YujoD9ILQ+LzEgwAAAANzUuaED+Z383gITGSIGQNlB+QEHEEbgBfIgcFPnhg7k9y3n9zdOne/PDRYv5wYmiwgwAAJ8hC+l3ofv3OFjqCdHN7l2a3mdeh2QB4GbOjd0IL9vKL9H6S1v/3va5xD/TlTR7Cd3AWUH98sW8O+4bxSVMxdb2I6HcsgHkAcBEGCA3cjvr6V3oPg7UXp94HcCgAAjwJsW4HSqNAQY+QDyIAACDLDb+d219D7Okt4kLGlfAoFwsIJ+uwjwhhgL1XmrxxMB1gjzl0J1Lm8/EJ4Gcrti6zToXZxyrd+kNg6uJzpsf22rwfh6EgE+69b1cgdEPoA8CIAAA/l9C/ld4lv+f7kF6SUQCIckIMAtoVHPH9vfUfv/ghPg5+HVCPAaFf1BqLbq6nWKZya1Bfv70uQ1TicWR4gPJrl37LOkWtN+dZoAa7+bJuI3LQ2AfAB5EAABBvL7lvJ74Vzu2ODU6LHB4o3y8ue0ABMItABzv6yIq0S1yz5r3u8+J8B+irLj4dV81t32fzq9mZ8n23eBzptI59y2l+w4E6F2HvAudwxAPoA8CGQyBBjI79uS370MD0z+Me8AA1B2HNH7pUTzoUnnQxPTTifA6fmvOcnVX3VZvlcOT8KrltwsAZbkPqhz/Kx3gJWWHnIy8gHkQQAEGMjvO5Hfa2S4+H8jwAAI8BG8X6o1Vi26j0xo6wmwWnLVojti/8/YZ73jW68FWO8VL2ccrxMB3hrMwQrkQeCmzg0dyO9by+813aSnLvItACDAh/xy6X3cBfdZ7+GuOAFWq3Ac+ErSq/d+cya4d9x+J0xcz2QIsGT2pZPaNpPlkU0IcFeodtcOlpZ02x4TcgAAQAgQYCC/AwBlB+VHjbhKam+bsKqLc9EJsGRY3ZdvlMPT8GqgLDFUDi/Cq9Gfr4VXLbzaNg6gVXTroxCvWZza9paJ8EYFeDHUTq9UsO3T/Sf4JQAAcFNHCID8DgCUHZQfKeqKrJbf8UQ8++xzf8a6YJ+1XCM7qyW2N1QH0BJ5Cz6+iVDtJi26Lf6QSG2uTlr7kmN0JvHF/RlECwCAmzpCAOR3AKDsoPwAAABACADI7wBA2UH5AQAAgBAAkN8BAAEG2F8wAi+QB4GbOjd0IL+T3wEoOxBgOFJ5nXwK5EHgps4NHcjv5HcAyg4EGJAPAPIgIARkUiC/AwBlB+XHjnE81B/FGZAPIA8CIAQA5HcAQIAPDath/dREgHwAeRAAIQAgvwMAAowAA/IB5EEAhADI7+R3AECAN8OJclgoh8VymC6HNls+Uw5nyuG6Le8vh4lkX51vp/u/38U1nmw7VA7XbN2FRIDPlsOVjHVZzJkwa9vhchhNBLrH0h4sbTN27OsWhpAP7nNAHgRu6ggBkN/J7wCUHUdPgCW/L8ph1mTygQlsFNMn5TBfDkWT36Vk/5IJZ/x/xbabtniHbZ0E9ZnJ7YhtN+eO89j20b5PM0Q7PebDcrjsRNhf94LFGWX4eTncL4cxk2yl6zjyAUAeBG7qCAGQ38nvAJQdR6v8kDxec5/7TIajmF5y61oR4DG37qYT09uJpJ4M1VbaVZPfyNXwqqW2kQAXknNoJMClRHjXwhHtcs0crEAeBG7qCAGQ38nvAJQdR1mAl0L91tbVZF0rAlxPTBXXSIPj+P3mbN8o0UsWZjOO2aoANzoeAABwU0cIgPwOAJQdR0SA/Tu3mo6ov0UB7t6AAKvL81hynBMtCPCYHVdhqEUBHkaAAQC4qSMEQH4nvwMAApyi93vvuM9qpX1SR4A1UJXe1W1zctqqAKub9Q23Tu8UP2pBgLNIBVhdpm8lnzcrwB1h/fvBPaF2nmKJfxe/HAAAhACA/A4ACPDBostEdMkEVe/HjtYR4E6T4wcmnPds+1YE+LjJ8113nOFtEuB8eDWw1W1L050tCPCE2zfUOa+lJukDAACEAID8DgAI8D6lzWR0PNS2fkosu5NtJcFq+R2x/bRNbB0thOqUSKIvEdWcyfXZJN58sl+P7VuPQqhtkY2CrfQP2bq8O2Yqu+nxPN1u31DnvPqbpA8AABACAPI7ACDAAHsJI/ACeRC4qXNDB/I7+R2AsgMBhiOV18mnQB4Eburc0IH8vt/yu6b+GM5YrsFdJjYZ50b21eisndt8TrG7ZKsMbfI4WV0eW03fVdt/3pYN23ex3egdwu5tiGfWfaf3w6uuqfEvIMAAyAeQB4GbOjd0IL8fiPy+WkdWJU6bTd9G9n0Zat/d2w4uhdYHjhkP6+cbbZW5sLkBavImwBLvy7Ysa0Cc7aC0TdfXDzIUH3AsbOEhCWUHAgzIBwB5EBACMimQ3/elAKsFMQ4yo21PZmzfb+t6MgRYLbyjtr4/2UeC5geqUetowcS0mbgdt31HQ7UVudNk7W6obQU+YXGOuWNpW7XALifbdrt4c3WO3e2O48+p145TCNUpXFIKoTra6+oGBLjPtsuKu8PSOxZqW9S9AHfYvh2JjE+E7IF2+tx36gX4ip3nwg48vKDs4H4JyAcAeRAQAgDy+54KsNavWLhi+1xx26oVc80kSdOcPHX75u2zuvfeSNbNmqBpmpMhEzfJ6H2LS3FON5DIpxanpiR5ZpLbZ3E8dmlcsM9RWJ+7be/bceK2oy69ivdJHckbcseZzbgOD2x9VvfuXKjO93m8RQG+4uJ+aOnucA8Snlp6b9n//YkAd9g+V92DhnuWxkU79rw73rTFs+jOc86JdGjwcAAQYCCvIx9AHgRu6tzQgfx+oAVYghlbTiVtmguz1+TKd2PuNFGbc1I44+IdM5kKiaBFybvj1vXZcY5npO+6k7lgxzhj//uuyZ0mjP492HtOWidCtQt0zqRvNBHPW3WunT9Of5LWKJhXWvweGglw3qTdx30/VLtP303kdc59Lpns30+u17SJbWxJ7rLv+KT9/9JJdIeljfIZAQZAPoA8CIAAA/n9SAhwKoH3bfm4iZTnZiJLvSa+sxbvah0BXjYBnnPhWcgeaGnUJE3yd9GOkSWmURglkUUT0ifJuUUBPmnp8cdfNCluJsAzdk08xYxrsxkBnrXz9Fxw6X4Rsrulx+u7YufgW2xvW3r9ua7atRy1a+S5hgAjwADIB5AHARBgIL8f9Py+YjKV8sgtnwjrB3tasvUTGeLn3xe9aBJ70/6/2ECAH5uYzSWhv07aT9j6BxbPhQwx7bBzUYiDN92rI8CFDAGeayB+/jizYf1gWrHr+FYFeC7jAYRPt9Lc10CA5+0a+dboe+4hhw+6Bmcz0jKPACPA+4Q43sBZ+/0pX/seHh1Wzixa8OWb8rd6iqj3xII9FOq2z9r2eqjtAaL/9bpDHFhv2vbxn/1xZ235tbD50eUPBczBCuRB4KbODR3I7/s1v9/IkCt1tX3pKnCpyMWuwlofu+f61sWHTpaeJxXK6QYCfMsqpZG2UH+gpQuh2uU5FVAvpqokr4XaQaOW6whwd4ZMFkK1u3QjAR6xa+KPsxDqd5/eiADHFlkf9zX77uJDjHG37myoTqkUr2+ffRdxsK+0u3mUXD1U6LXvvzMRZspnBHg/MGF5+bb9PhfsN5BzefWmlQ/j9ruccL/Zpya6V2yfVXs4VrBy5YUr+2IPkEsW1zN7mOY/x2nkrttvSsedsXh6yPUAANzUuaED+X0T+T2XP9fTPjh1tbzfzDafzkmrTN4xOY1dYe8mFc6XVsE7Y9veS+QoVvwWrOI352T4lqtcPg61XYqfmMj1m5y9MOE8Y5XYRyF7sKVpi2vM5POhVUqDVT5X7e9JS/uExbloldZ5J5fPXHqvW2V6zMnzxTrX7pJtWzQ5jV24h+0c4ju1G6nULyZhyM7/kVX4z7i4+92+a5beMbumZzMeMFyy69Jhy56bBBRMqBVHl3swct/OZd62pXxGgPeLAKdd+h9Znm+z34cf6dz3SJkLta8ldGU84FpywrwYanu/3LQywn+ec+XgvEtXIWzPHNwAAIAQAByd/P7m4FS+fXDyVnn7lzv4G+m1ilus7EWh8xXOJZPOxYwKZkeodgm8aBJWsHUSratuv26rMMbWxSilsTX3hEm0ll12QpbFuEvzeJKeK6E66NNoqHZvHDGpjILYZum5bv+3hWqX70W3XRbddpzL7rixC+SCnUur9IfsrtdRcjtDtcVZcaddnkfsHOI5Blfh73TneslJeY+lP3Yj7XH7tblzuWTfT4FfPwK8TwQ4fd3AS24sz+7YQ7IXiQAvZjwEvGoP/VZt+4mMeJt9HraHSM8trnFyPAAAN3Vu6EB+byW/F95uOzY4OXZssPhA2/mwR7+RrAonACDAeyXA6bgDt0L1Adsze6AjIe0K61uAvQDH0dv1kCdOxba0SQEWcR7zy5aOaXI9AAA3dW7oQH6vl9/7z3Wqi3N7fup/TcUXAQag7OB++bo88lOORenNm3y+CNUeLOqVodcUFuoIsF7L8F2iFdfzTQrwcqi+DyxuhtoxDQAAgJs6N3Qgvyu+yvu9+akfKofn9cTXhSXtt6vh5Ld97Ni7/9GVXT8ugXDIgn6/+h2/9wMfL/3SF3+b++XmBViS+sgEVN2W4zv9nfY5zsH90B7e3aojwL0Wl2T1qknsQxffRgT4gol4HFjwSaidnu1IwQi8QB4EhIAbOpDf1+f3wW+/fGywuBjf7yUQCEcncL/ckgBLctVaq/ds02nSJMFjFrosxNHPe8L69+cVj97111gBajE+7uLsC7Xvxjf73GtpinEd+fsk9TogDwJCwA0dyO+1+b1wLndscGq0LMI3ysv2ZwswgUCgBXj/CTAgHwDkQUCAAQ50fm9BhvmNABzdsoP7ZQW9Z3uT3IR8AJAHAQEGOEz53cvwwOQfI8AAlB3cLwH5ACAPAgIMcPjze03L8NRFvgEABJj7JSAfAORBQIAByO8AgAADbHfezU+OH8tPXWo/XezdSF4nnwICDNzUuaED+Z38DkDZgQDDgcy7FpabyTDyAQgwcFPnhg7kd/I7AGUHAgyHQYBLzWSYOVhhryEPAkIAQH4HAAQYtpk3B6eO5/LnerYjSCJVWd+u0D5QHMkNFCe2I5Tjur1OfgeKf9qKDAMAcFPnhg7kd/I7AGXHlsqP7ZwTvCwy148NFhe3Kdyw+Y63JeQGiw/Lf1e3MbQy3zph6+FKKLzdxq8eALipIwRAfie/A1B2bIcAE/ZHWNtmQd+2hwftA8W72/ZgY6C43PRaDBT/y7HBqf/+jVPn+/m1AwA3dYQAyO/kdwDKjv3aAnxhu7rKVsI2duN9c3Aqv11djBVC/7lOcuLm825WODY4+X/kBouX3zp1rpsrBQDc1BECIL+T3wFg2wWY8gP2XoAnV/TwRHPVc4UAgJs6N3Qgv5PfAQABhkMowFP3NMBWo+0ZgRf2GvIgIAQA5HcAQIABNpd388VZvQvc6vu9zMEK+6W8JQ8CQgBAfgcABBgA+QDyIABCAEB+BwAEGAD5APIgAEIAQH4HAAQYAPmAPUADrik/tTraOHkQEAIA8jsAIMAACDAc6DxVDi/KMnz92MniCfIgIAQA5HcAQIABEGA4zAJcDQPFu+0D54fJg4AQAJDfAQABBkCA4RAL8OSfvP4/X3yUG5gs+jmpyYOAEACQ3wEAAQbYFd48PfXflPPpkqZOUl4lELYalJ/WtQAn4Vh+6nllu1PffkV5r2kezE+d5dcKCAEA+R0AEGCAbcnrBMJ+D0gwIAQA5HcAQIABtkQuP1Wg1ZKw2y3AnV/3gdLgt31/qfj2j5S+/7/7XKW8rBfe+4GPU5YCQgBAfgcABBgAYP+Wn1nS+/6Pfab0i7/6P5de/smfUpYCQgBAfgcABBgA4FAJ8NNjg5Nf1P9q6aUsBYQAgPwOAAgwAMChoX1walrz/+ZOFc+Ewttt1MUAIQAgvwMAAgywL4jvAOsvVwOoiwGZkEwI5HfyOwBlB+UHHPq8Tj4F6mJAJiQTAvmd/A5A2YEAAwIMQF0MyIRkQiC/AwBlB+UHIMAA1MWATAhAfgcABJjyAxBgAOpiQCYEIL8DAAIMgAAD5SllKZAJAcjvAIAAAyDAQHlKWQpkQgDyOwAgwAAIMFAXAyATApDfAQABBtggzAMM1MWATEgmBPI7+R2AsgMBBgCgLgZkQjIhkN8BgLKD8gMAgLoYkAkByO8AQNlB+QEAQF0MyIQA5HcAQIABAChPKUuBTAhAfgcABBgAgPKUshTIhADkdwBAgAF2AkaBBupiQCY8GJkwVw4ny6G/HNr4VoFCFwAQYIDN53XyKVAXAzLh/syEkt35cnheDk/KYc3C6DbFL6meaXHbxXLgh0h+BwDKDsoPQIABqIsBmXBHWCiHlXLoc8smyuFleNUavFUWLbSC0tBDjiK/AwBlB+UHIMAA1MWATLjdHDfRzWesu1IOY+7zkMny9XIYd8slrDMWxzXb5v9v735C41r7PLE/b7+6vnp5FRCJGrTQokhMRmG8ENO+tpoIInBeDGOCFl4YYohurNuIN4bxwhO0MEENZjC0CSJ44YUXWpjBSQxjgiFamCCCCSbjhRYOiOCFIF4IojAmeBKn2z2t1HP1O11PHVeVqmRJluzPBx4k1Tl1/tVP59S3nlPnnIthOUBvRJuPx8aabSlCcR7/UjGt3Os8W4Tw6WLcm6n91Ow8neUYlscZKYZVy5OX9VqXdb+eWj3OM8XyTRW/V/I4o7XnPqqta4plz+tzN7ZfnveV2rQWDumDBfUOCMAgAGN/al+KIhxADmg7fYyXA9+HCKH5OZsR8KrQl4e9inD3MP7OAfVss72Mdjntfc94q9lWIhjeiQB+PqZVngK9HsuWw+Ri2js9+14RfrdiXnPxvI2Yfophb2IZr3dYn+VYh/zc2832PuZXBe/12vi7qdUzvRLTvhbb430R2vN08+njj2O8a7EsldHYNhPq3U4XHCvtPxCAwXsxFOHxulMLaN1sRritnI1QOBHhL/8+XgzfKUJheQr0RMyz9Cq1elzrAfhBMd7NIpje6RBSN1Ort3crxu9kKELoTPHYgz4D8EQtDGe59/lFEYBfF8OGIyBX81osxlXvdrrgWGn/gQAM3ouhCI9R7h3d7mO8HPoma4+9i5BbBeDSVpcAnOXTf3NP7tMIrR97BODy4lllMF2N5V4v2nbx3HL+dY1Y3uEu0+4VgKt1Lee7UXyIsJw+/75zDtcPi7B/Xb3b6YJjpQCMAAzei6EIj78Iz3YJtylC20r83umCWDsHCMBTEXjzeuZTovOpzC97BOD5HgH4UYTSso32EYDHY3lH+wzAw7UA/L7DfCd6BODzsa3yNv5QC97qHXCstP/gG+M+wHgvhiI82UWYT8ldS+0XkZqJoFpdwCmH1LvF8MsxfKSPAPyoCIX5dOHXtTD64QABOJ/e/LZY5nxac+5dnesjAGf1U7qfFtPOF/7aTq0Lbl0uAvBorPfl4rl5nR73CMDZm9jOj9S7nS44VgrAAN6LoQi/XhGOR3jMoe9JhOEc8srv6uZezPcx/EH8XgXI/QJwPo15J7WumPwhguC9CMMbESIHCcDD8fubYjovU/tFsHoF4JlYh9zL/Sy1TqdOEXK3Y5s8iWlvp9b3fqsLXz2I4Jt/n94nAN+ObTTzVet0+sb1M9O/3PnxzxfO2ukCAjCA7GFr8j0X4XSEzOup8714czC8FuM0ao/PdphWdYpx7km9nFq9po2YxtUYp5FatxIq7wM8ldovrDWePj8N+1JM63Jqv0VSOf9ewf96TGM5tZ/2XK3r1QjV06n91OVqHa7VlrGROp9OnrfP5kmp02gbBw3DdrqAAAwge6AIFeHpVQ/AhyWfop0DZj79+dYJC8C7Bw3D6h0QgAFkDxThkRRhdSEF7ejab//0H6z95vd/+uawp/vD5D/+b9Jv/uTTb373b//vZ/7s+t2vvZ7NGlsvg++Ziwt/2/z5adAwbKcLCMAAAjCK8EiKsEevnaYdXpv+NQzXH7+fZv9yyE4XEIChf64CjQCMItQDrJ2AVu8B7tguLPz1mYsLqz/89BdTdrqAAAwHr3V1igCMIlSEnIA6bYXdX/5N8ffO8MWFu7//6efxk1bvOYznZRu+cGPBqwgCsOMlAjBqTPZAEcLgAfjXdmPzxwsLi2n25+GTVO9V6G2O9/bvv7Ps/wMEYMdLBGCQPVCEMHgA/uVFM/heOUn13in0tl20y/8HCMCOlwjAIHugCKGvOp1eWNrv+73HXe/dQ++Nv+sQgtd9l1vTTv91CP7wx7/6dT9wkJafa3+gnaJrbqhT7UhrTPZAAIZTVO/DF29suwK3pmmapmnawZrsgQAMp6neL/7nd89c/GXuzMWFxz9euPGv+9jR+yRd0/QA2x9oeoA1NaYHGAEYTnm9z/483ArDC/+P7wCDfYfjJaeV+wAje6AIFSHqvf96L8PwxRv/rwAM9h2OlwCyB4oQvv16bwvDv9y29UEAdrwE7E9lDxQhqHdAAAawP7UvRRGCegcEYAD7U/tSFCGod0AABvBeDBQhqHdAAIZBuAo03ouhCBUh6l29g32HAMx3VevqFO/FUISKEPWu3sG+QwBGAAbvxVCEihD1Dth32H/8Kq9fo8Pjt5pt6oDTnB/guSPNNnzCtslon+N9yTY6nFr/R//pP/vxp5/7rdOhAdbtoNukbrLZppvtfLRquy3XWn5s/Jhe28P4n15qtrnip/2pfSmKENQ7IACfArvNNtvh8a0IsgexPsBz33UJ4F/L6gDL/qTZLn/Vpf3tD//3malr/dbpyy6v9X7Gmm37gEv4OIL3avysautZLQC/arb3x1AL41GfX+phLPfDQwrU3ouBIgT1DgjAJzAAdwsoQ6nVg9cpAOeet4ku869Pczj13xs43GW61TxH9wl2w32G90bqr6d6qMey91rWankGXc/dDgF4pMvrtNXhtR7aZ5mqdd/t8PjIPstcbs+ynjrVVl6OzWa7M2D97rcME31OZzSm1W0aQ7XHrsY6XG+2a/an9qUoQlDvgAD87QTgvA1yb+ebZttIe72BM7UwsBPPeR3jVc+djMe2i1b1mr6M+ede4OkIGblH7X089iae382DYty3qXWK7dkIXjvR1opQmpcr9z6+iOd9THunsWb34+/8nFvFY9W6fUh7PZmdtlH+/W6s3/tY9jJ83Y/Ht2JZZ2qvwWr8vN1hPe8Wy7Ad2/vvt99vzvx+97f/3n/0KNbxRYz7LuZXLV9+/T7Vnr9cLNNWbZlKr2LZtuJ1ykHxaTx3O2qi2+t0OV6Pq/Gz14crG6nVm7qc2ntq6yF8N8bZjtdlrQiwq7F8mzF8p6i5cjqzsQ2fxHgfo/5SUbtvY1u+i2lWy3S+9tP+1L4URQjqHRCAv6EA/LEIOVXgrXolPxbh6VJMs3ru8wh/ZRB8UZt/o5hPDstVr+1CBJChDstX9SpWwXYpAlSKaVRBZigCzlrxvHKd5yIYVuGp7AG+HMFotBaeproE4OexTYYjNN6LYTcjjI0V89wp5rkbYb6RPu+xHo/lGy2e+6rcfkUP8IMIaamY79vaazpb234Txev2PnXuMa+Hz9ViXbM7PV6n1KW2HsUyzMdyPo9t3RggAD9Mre8152leL5Zvu1i3laiJTgF4N+osxeua/z4Xf78pPhwZj3Vctz+1L0URgnoHBOBvPwA/qQ3fjtB0sxbIqgBaPbcKhDn8TUc4We8SgDcjIM8WLYe/Tr1sz1L76bLVqcfjMc3ytNjJeGw0lutN7XnlMtRPgR6N5c/TuBYhcbZLAC4vhnQ3tXqL1yOsleu1U4y/m7r3oOaQXPU8z6XPT9Pd/eEf/icrxX2AR2KZz0cA3+oSgHPgfFxbpnep1TvcKwC/j9e+3IYf4vXtNwC/jHV6UYTZ8tTxfgLwueLvp6nVe7ya2ntyZ4vtUA/AHzos22xMeze1n/Z+WwC2L0URgnoHBODTLYeZy30E4Lu14a9i+HKHUPCseO5cBKvtCF3PegTgPM+NGF62Tlda7vZd3bPp8++rDhfzme+wvN0CcA7RaxGSql7l3R4BeLYW4FaLYZsd1utyh/l3cj7CaqfTdMvnzsR8diJYPu4RgNf3Waa0T/hsdAmO/Qbg+Vqw/FB7nfsJwOUyrNYC8HKfAXiry3pUH1KU5gVg+1IUIah3QAA+3XLgXKo9NhYh4XwRRspTa4ciOJ9Pn/eoptTeA5zHu14Mu9kjAL+pBaM8n9wj2em03Ge1UJ7Hqb4HWw9HeTk/RRAeJADn3uiXqdULOHTAAJzDaP3iTnOp1UvdKwCP10LpbGrvFS+fu1Gbz5XUuwe4/qHGldT5Al718Lmd2nu7R2KZ+r0lVKfvAD+PQF6dRr1Ue52mjjkAdzqT4L4AbF+KIgT1DgjAp1sOpLn3LX8PMveeXoowslELcx8jiA3F32+K4LmTWt+jrL5jWwWcj8Ww6qJCm7Ugcz2mcysCyLliPu9S56svX4n5TsXwlSKcVD3NoxFgqgsdpT4CcO7xfRjLmgPPq9Q6jfvBAQPw9VjW6kJfi7HNx/sIwI3YhtUpxzMRNieK587HuubXpPre8UQs+6dauFuK+c7FhxPVd7cXasvU6QORuZjP/fiQoxHh91Fqfcf2oAF4IpZnuXh930ctjMcHMMcZgFPMcy1q7FpsHwHYvhRFCOodEIC/gRC8EW/w36VWT2oZ5nIQqK4wvJY+72Gt7uP6NJ5f9VrOReB9H8+7Gj+rnr4HETquxN9LMf6HmF+vq0DPF9N+VixzFcqqqyGvpNZ3Zy/H36X14rnV8t6Px6pToN/EdloplrW8D/CT1N4DOp/ae9YXYxrvI5BPd5l/J9fjuR8jaF4pht0vtt9MvI7VPK7EtKtezNsx7mKxjG9i/V6l3qcwP0qtK0UPFfPdiXUfH6Deut0/eT6292jMYyWm/zYC6HqPbbZUhOqlWsCeKj4AKe8DXD6eOryOI6nV6/s4Phh5Yn9qX4oiBPUOCMDftrI3E74XD1L7KdCPUvsVze1P7UtRhKDeAQFYAOa45Ks/5xotrgLN4anOesg95rn3N/dGT9qf2peiCEG9AwLwty2fEjpjM5zcWlenRyKfhp1PP8/bNn8/ffx7rjHvxVCEoN4BARgEYOxP7UtRhKDeAQEYBGC8F7MvRRGCegcEYBCA8V4MFCGod0AABgEY78VAEaLe1TsgAIMAjPdiKEJFiHpX74AAjAAM3ouhCBUh6l29g32H/QffHPcBxnsxFKEiRL2rd7DvEIABvBdDESpC1Dtg32H/AeC9GIoQ1Dtg32H/AeC9GIoQ1DsgAAPYn9qXoghBvQMCMID9qX0pihDUOyAAw1FwFWi8F0MRKkLUu3oH+w4BmO+q1tUp3ouhCBUh6l29g32HAIwADN6LoQgVIeodsO+w/0AABu/FUISg3gEB2P4DARi8F0MRgnoHBGAQgLE/tS9FEYJ6BwRgEICxP7UvRRGCegcEYBCAOY019oc//tWv+8VBW36eGkUgAPUOCMDwxdwHmCPfn1688TTvC7+05enYmggEoN4BARjgxGruB9fzvvDP5v/p7n92758N3PLzIgSv25oIBKDeAQEY4MQH4Bxm/8fN/3bglp8nACMQgHoHBGAAARgEAlDvgAAMIACDQIB6V++AAAwgAOOg7oCOelfvgADM98RVoBGAcVB3QEe9q3ew7xCA+a5qXZ0iAOOg7oCOelfvYN8hACMAgwCMQGBHiXoH7DvsPxCAQQBGIAD1DgjA9h8IwCAAIxCAegcEYBCAEYAFYAQCUO+AAAwCMAKwAIxAAOodEIBBAEYABoEA1DsgAMOA3AcYARgHdQd01Lt6B/sOARhAAMZB3QEd9Q7Yd9h/AAjACASg3gH7DvsPAAEYgQDUOyAAAwjAAjACAah3QAAGEIAFYAQCUO+AAAxHwVWgEYBxUHdAR72rd7DvEID5rmpdnSIA46DugI56V+9g3yEAIwBz3JZrbanZzh3StGebbU4AxkHdAR31rt4BARgBmJNgt9lWIvzeb7bnzfax2W4eUrheFYBxUHdAR72rd0AARgDmpATgRu2xa832qcPjY8020WU6QzH+8IABeDym28lIj2ECMAIBqHdAALb/QADmiwNw9qbZbhdB9Fmz7TTbZrO9bbbpYtzFGJaf8z61eo/LADwdw67G35PN9rrZtpptu9nWYj7V89bj8RzERwVgBAJQ74B9h/0HAjBHFYAfF+H1Udo7NXoo/s7B+F3a6+3Nz82nTJ+PYefi74kiAE/G+FeL6W802934fSjm96gIwHkaU6l7j7MAjEAA6h0QgO0/EIA59ACce24vF8OG4rGZZruV9nprS2NFkH2Z9npy7xTDz8Z8r6S9C2XNRqjeqT1vYAIwAgGod0AAhhPBfYBPVQB+XYTWPM5kbfhWBNjlCMud5GEfIkjn8atTnGdjmqsdWvW8AwVQARiBANQ7IAADDBKAz8fj54qwW56+nE99rk57XoywXMpXlZ5K7d8Bzj26D+L3iZh+eXpzIwK1AIxA4ICOegfsO+w/gCMLwPn04/loudc3n4p8vxgnP5YvfpV7gcci1FahN1/F+X08dzh+5r9HawF4MkLzbPydL3r1PEJwbq+SHmAc1B3QUe+AfYf9B3CE1mvtSWrv7c2GihCce4MfRfCtnI/n5mEvU+uCWDkMLxXjLRYhdySm8zbag9Q6RTo/b0UARiAA9Q7Yd9h/AAjACASg3gEB2P4DEIAFYAQCUO+AAAxfmatAIwDjoO6AjnpX72DfIQDzXdW6OkUAxkHdAR31rt7BvkMARgAGARiBwI4S9Q7Yd9h/IACDAIxAAOodEIDtPxCAOX759kjjfY57q9kaAjAO6g7oqHf1DvYdAjACMKdRDonzfY6b7y88JQDjoO6AjnpX72DfIQAjAHMcRlP3XtiJZhvr8dw8fKT22FaHADwS8xjtc3kmDrCsQ92eJwAjEIB6BwRgEIC/b8Nprwf2fbO9aba3zTYZw3Kv7Ga07WZbK4JwDrcvmm0jwu7HZrsZw+4326dm20l7pzfnULoaf+fxPzTbg1pYno3fd5vtUcwvL9PrYp716eRlnY5hjZjOekxjXgBGIAD1DgjAcDJTmPsAfy13ImRWPbh3m+1lhM0cMJeK8Pk8wnIVgHPoPRd/X4tgW4baKoQuRIgejr/PRUgd7xKAV2N+wxHKb8ew5dqyXm+2dzFuI557J4aPCMAIBKDeAQEYoJTD7mL5WUSEx/Nprxd3uBg2HaG3CsAvi2FVAO0UgKsAPRrTXYhxG10CcPkhyGoE3xRh+H4Mr9rHWK5q/l1PrxaAEQhAvQMCMPB96/Rd3RThcqv2WBly83PW+wzAedirtHfqcj5t+u4BA3Aeby0eK9tkh/kLwAgEoN4BARigTQ6kt4u/z6a97+BOps97VC+nve/lDhqAc0h9mvZ6gbOxAwbg/L3fm8WwoZjHqACMQADqHbDvsP8A9nM9Amj+Xm4+9flJhNXsVfw+FoE4B9D7fQbgPOxBPL4aQXs4pvU0xp0cMADn8JsvjjUd08qPv4vfBWAEAlDvgABs/wHsKwfLNxFEH6XWBaTG4u/8+GYEzqoXN/cGrxTTGK8F4vl4zlIMW4vp5ItYXYtgWwXd8j7A66n9nsBLqf0U7XJZ14oQXZ+/AIxAAOodEIDhZHIVaI6aAIxAAOodEIDhRNW6OkUAxkHdAR31rt7BvkMARgAGARiBwI4S9Q7Yd9h/IACDAIxAcBzyzbzno539SstQ3fsM9Q7Yd9h/IACDAIxAcOjyVfHylefypdjzleueNdvHZrt3SNO/mtqvrNdLeXl41Dtg32H/gQAMAjACwaF6HgF4pHhsKkLwlUOY/mo01Ls3sGDfIQAjAPOtmkvt9/0VgHFQP4EH9Hyj8PLm3aV8M/Hzxd/5XmX5fmf5fmUrRWDOYTn3HOdTpzeiVfc4y/dV245W9QLnaeabhr+NcW8X8yjvj7YSv+dp5/ujPU5790VLxXSexbA8vfK07Wp5qnu21Y3E9DfjA4CbxfLV7wWXrRfzrp6bt8Or1H4/t/z7rbR3g/SXzXYnWulhs11S794YgGOl/QcCMN+U+n1+BWAc1E/gAX0hwmk//9A5LE5HWK56jbPZZvuU9np5J2OanyKQjkQ4fRoBMp9u/SF2Do0Igh+KQFieAr0ey3Y5gvqrCI8ppv2+2RZjOosx7mgM3yqC+HSH9Xkcy5+XZyamtV6E2PrOYDe1vpu8FsF7Mqadg/y1GLYc67MUHyDk9dpJrRutT6S9nvUR9e6NAThW2n/wbXIf4JP5ssT7vkE0erxnG0vtHTO95tso3guWRuO9oQCMQHDMn1Rt9TFeDpdXa//0Vc/xbPxe7iDepdYpIOUp0PkfvTyteiS19xjXA/C9Wliv/knvRQgtvYwgXAXg613WZSQC+rniseU+A/Bk/D5aW65XxXRe1J6bt8Vc/H4nwrd69wYWHCvtP4CjV52huFW8d91K7acql+8/l+O92maM9zHe65XvCVfivXHu9FiLkFufTv79SbwPrM6GLDtl8nvZ3AHzJrU6ffr+wEQARiA4uGvxz9fJePEPXfaApiJkzhYBuNOwegCu5vkidgh5vJ0eAXixtgNbL8bb7dCWO8y/rtFheef7DMCzXea7Vew06993zo89jd9zb/El9e4NLDhWCsDAsQXg/F4tn1E40eV9Yj0A52BbdZQsxnvV8j3h3fh9NLV3EtUD8JvU6jTJZzE+j9/nYhnGa8soACMQHIO8I/jU5R/uWRHmPtY+tRqKncP0gAH4cgTuK8UO4XWPADzfJaQ+arYHtXmOdZl/6jDebmo/5WSxFoBfFsNGigA8E+s9VBs+3CMAN2L7XY7QP6TevYEFx0oBGDi2ALzV431qpwD8vPY+brcWgMvrzqx3eR+7WgTl+vvYPOx+bZl2BGAEguOTP5HaTO2nBC+m9tOEcw/m49rw7Qh++wXgB8Vz8wWvNorxpmI+gwbgq7GjqELsePw910cArqZ9rwjzL4tpVyG9OqX7ZhGAh2O9y57px6l1OnanAFzNbzMd3q2l1DsgAAP0F4DXBwzAq/sE4EafAXi5y3K8SJ/f9nO/964CMALBIRqKEJx7Kd9FkMw/y+/q5oCZe2rfxs88fCaG7ReAr8bw1zGd6gJVL6OtFcGw3wCcUuu7E+uxzCsD7ETORiDdiHV6U0x7qJhmfrz6/ka1s5uJEPy6mEZjnwBcndoyqd69gQXHSgEYOFEB+OkxB+D7tXkMx/twARiB4JjlHs+pfUJa/oc/lwY/jbe8Ut5QzKdxCMucT6M+nwa/ql+1HOdiGssddo45JE/s89x+A23umX517HU5feP6melf7vz45wtn1TsgAMPxcBXoEx+AcwfM43gvmjtqPhxzAK7uZnIzQm8+k/CTAIwAzHHqFIAPw3hq3Y/4+teqy2gbhxWG1TsgAMP+ta5OT4T81baV2mOTEYJzT3A+0+9WEWLzz6Xae7n1WuAtb3+0EvNIqf0+wPV7AteXI3fg5J7nfCbktdS6to4AjADMsZir7ewOy1jsKJe/Zl12aF8UhtU7IACDAMyB5a8ZLtRC9m4a4IxGAZhvLgBXp85o2pe0aufY1i7c+LsvDcMCMCAAgwDMgeWv0eVToHOPcK6RfM2ZB4NMQADmmwvAPXruNO0o2/00+5dDx13vgGOl/QcCMN+ZRto79fpOs10a9MkCMN9cANYDrB1ZD/Dn7W/OXFj45z/89BdTX6veAcdK+w8EYBCA+Y4DMBxmXXZqZ6YX/tXwxYW7v//p53H1DgjAIABzYg0LwAjAcOAAfGPzxwsLi2n252H1DgjAIABz4u2kvXsHTwrACMDQdwD+5UUz+MOIhJkAACQgSURBVF5R74AADEfLfYA5ZPkK0f+y2f6vtHd3kWs//jT/PwvACMBQr8vphaUzFxdWB/l+r3oHBGCAv7ccAfSktP+z2f42Df341z/8B/9YAEYABvUOCMAA35QcfD9E+N1utqUzU9f+Fz3ACASg3gEBGOBb87fN9i+a7XL1gO8AIxCAegcEYIBv0Wd37BCAEQhAvQMCMMB3QQBGIAD1DgjAcCK4CjQCMA7qDuiod/UO9h0CMN9VratTBGAc1B3QUe/qHew7BGAEYBCAEQjsKFHvgH2H/QcCMAjACASg3gEB2P4DARgEYAQCUO+AAAwCMAKwAIxAAOodEIBBAEYAFoARCEC9AwIwCMAIwCAQgHoHBGAYkPsAIwDjoO6AjnpX72DfIQADCMA4qDugo94B+w77DwABGIEA1Dtg32H/ASAAIxCAegcEYAABWABGIAD1DgjAAAKwAIxAAOodEIDhKLgKNAIwDuoO6Kh39Q72HQIw31Wtq1MEYBzUHdBR7+od7DsEYARgEIARCOwoUe+AfYf9BwIwCMAIBKDeAQHY/gMBGARgBAJQ74AA/M3Z6vDYRDw+8QXT7Oe5Q8129YRtj+lmGz3k9TyyWv/h3/+PB6nTawec1dAXPPdes4032/3ads3Te91sn5rtY7OtNdvZr7AZnwxQg/1ug/x65MC3Gk0AFoARCEC9AwLwCbHb4bFGPN74gmn289zZLgH8a2+Pftd7eYCwfOh+2/gPV3/z40i/ddro8lr3Y/4LXqe12EbPm204HrvZbDsRKMci+D5qtu0Iy8dpPdbvMLffVATrGQFYAEYgAPUOCMCnLwBPRTC5HGGh3lOXg03uRbseYaceIs/H83I7VzznVoSe2WLc8ZjO9T7CUDXufIfQOhWPXy2CVzYZ41bLdKn2nN0IZtW8x+LvPO6VtNcbWgb44Wj595EYt9Oyd1vW0ZjvVLH9Oq3ntfr2++2f/oO13/zwu90chGvrV23r6eLxa7Fus8X2GC2m2y3053HvdXidGvG8/V6nap5VTeTt+TG2ZSlv11e1MLrfNhuPYXPx/Gr8ueJ1Go7tMBbD6vWw3mWe9fUaZPtdLR6/dpp3DgIwAgGod0AA/h4DcH7zmnsAn0YYel8EmBz63qS9nr778Xv53Dz+22a7m/Z6+T5GkB6L53xIrV6y/HjuGXwQbacW4lItVO/Ecx/EMk0X83wXP5/HslfLk8ffjLD1MKZxN4YtxbLn9ZyJsLkTy12tx/PatmsU2+t1jPsitfdmni+mU63XlSJEb8W0N4qAWwayd/Hc+/HcHKzGmuH3f02/+ZO//s2P/9ZajLsY870X88nbdiGGPY1lXI1tPxXjrhbTneuwnfO4L2uv03xs7wfxWK/Xqe56PHc/07Vt9r4Ik7PF9noYvz+L1/RBbM8HRS2/j7qs6mEz6rYegC/HuA871N8g22+o9lMAFoARCEC9AwLwKQvAz4rhV1PrlNjbEZBSEU7K5+bAMVkMfxKBoQx/la0ISKkIdK+7LHcOmXeKv29HkM3z+pTae+TyPB8XAfh1LZC97RBqq/kv1UL3bo8AXPYmvy0C26tYvspchNpye3X7LvF8bXkvFduovv0epfZe2nvF69aoLXvefsu16W53CW3lKdDDtQ9Aqg8OXvdZb8uxPfazUdtmV2K+I8U2O1sMK7fhlWJ5O702L4tplwH4bbzmlYVYji/dfgKwAIxAAOodEIBPWQBeKIaPxPDxCFh3a8//UDw3B4Lcs5ZPd36QWr1m9QA3EdNciWCxHON3+97lxwik+wXGeiCqX5ioHiLrp2+fjWnei9DTKwCPFMOqYDUUwx4V63W/CGz1+ddNxDZ7G9vjUhGyOj03P3YztuPbWI5OAe5TbIdqme6m7t9/LgPwdGz70mQ8d7iPesvBc7PPupzs8JpPxzru1Nb5XZfXtJE+73FeLj4YqF6nTvW3UqxXv9vv7Le0c6gC8J/N/9Nfw+ygLT9PAEYgAPUOCMAnLQA3ugSaiVpIqAwXw5+n9p6wFIGtEeO9jpYD5NUIHqtdgkqe5mJqfYd1PnW/QFEed6pLWHtZe+zyAQPwYmqdEpsD/Nw+ATh1CMDVhwVLHdZrJPV3IbDRGP9JLM+zLsv+LMJlDtjXY7m7BeD8+50OyzS+TwCeiQ84On1gMtJHvc1GeBztEo4Xi/qq1+X7mH99vXv93Yh6rAfg57XXqVqHm11epy/Zfqc3AF+48TwC7Je15nQcnRAIQL0DAvBJsBNv+ks57L2rhbl7tUBZDb+b2r8Xe7YILzPx+1BtWp0C8FAEq8vFuDMR4jp5ndpPV52P5ZiO6ZQB616xjP0E4KoXb7M2j6sHCMApttVC7QOGx6l18axeAXgutZ8KXJ6GXT636sEse00f9QjAb2qv+9lYppF9AvBoBNip2vB3fdZbfp3f1uqpWv73xTbbqn34MVUE50EDcL1n9nlqnT5f9tS/T+3fg54u6u9Ltt+p35/+4Y9/9et+cdCWn+e9GAIBqHdAAD5JFlP76Zz558da+FiPcHAntS60VA0fi79XIuS9Sq1ToCdiWnci2FYXnXpchLmPEYZGIuhtRwBfjBDT7TW4GqHrVrFMV4uAU11R+G4s+/k+A3Ce5tPUupVNns6VCDsbqb2ns98AfD22ye3YRpsRTlMfAXiq2IZVyH9WbL9Psf2q1+FRbOvqQmAvi9cpL+ODeF2uxnZZSq3vuna7Zc9MLMPd4gOF6vuyt2Ldrg9Qc9Mx77V4fnWV6afFONXFsqrXtwzNBwnAG7Ge92NeYx1ep8Va/b0t6m+/7fc6nfJbHnkvhiIE9Q4IwN/L/mM6gsFqhIypDmHuZgSgHGIv1YZPFMNmIkCMFtN+EMNyMDuXPr/QUHk/3cvF+HP7LPdMal0xeqZ4fCimW129uez9m6tNtxHLW26L5ZjeSASc1Qivo/F3I8atlnu0Q1Cfr23H6fiQ4FGEu6Eu8+/kfDx3NbVOEU7D07/M/nb8H/4Pf/L7P62uTDxZm0cjtV/E62osZ6PDMs2n3hdwqr9Oc/EaraT+rwBdGo9tWl3F+0qP1/fhPq9Zr7+rAFz15t5N7acp11+nS8U8r3b40GW5qKdBtp/3YqAIQb0DAvApUf8OMCeo1tVpT1UAxnsxFCGod8C+w/5DABaABWC8F0MRgnoHBGD7DwRg1Jj3YihCUO+AAAwCMPan9qUoQlDvgAAMAjDei9mXoghBvQMCMAjAeC8GihC+Wr3/cOHG+Tzemekb1215EIAdLxGAQfZAEcK3U++zPw//eGHhSrM9ao6zncfzvwH2HY6XnCb5PsC5RvNPWwPZA0WoCFHvbfX+u4u/TAxfuLHw4/SN583g+/9Vobds/jfAvsPxEkD2QBHCqa33ZlsfvrjwulPg7dDWfz0VWtO0U9vy/3H+f/7DH//q1/3AQVp+rn2Cpmn2p1+2P632pbIHAjAccb3/9y/+5e74H/7Jbp+hV9M0TdM0TTuqdmFh0TtbBGA44nr/rx7+i6j3hY3mzx09wJqmx0IPsKZp2oD71AsL//UXPl/4RQCGr1Hvv7t4Y2b44sLdHy/+8r91C8D+N8C+w/ESAARg+KbqfXj650YzCN9sttxT9DcCMNh3OF5y2rgKNGoQB3UHdNT74PU++1+MnLl44+qZiwurORTb8iAAO15ymmpdnaIGcVB3QEe9q3ew7xCAET5ADSIQKFLUO2DfYf+B8AFqEIEA1DsgANt/IHyAGkQgAPUOCMAgfIAaRCAA9Q4IwCB8oAZBIAD1DgjAIHygBkEgAPUOCMAwIPdgRQ3ioO6AjnpX72DfIQADgIO6AzrqHbDvsP8AAIEA1Dtg32H/AQACwSE722zXm+1as018pWWYbLaGilLvgH2H/QcACARHYaTZnjfb+/i53mwfm+3OIU3/SrPd63Pc1Wbzpka9A/Yd9h8AIBAciWfN9rLZRovHZprtU4TXL7UarR9jteVAvQP2HfYfnCquwIsaxEH95B7Q8ynHu/GzbiGCcGW+2dbSXg9xXs6RYhr3096p0y9inKtFkH4bbSkem2q2xzGdPP7N2jzn4velmM5qjPuwFo7zdJ7EsDy9RjHsfkwnD7vVYd2GYh3WYxpXi+WbKX4vQ/xY/J7X+248t1zXFPO8HsvzLNZnoTatPN/z6t0bWHCstP/g2651dYoaxEH95B3Qc6jd7mO82xFiZyN45vD3PIblx3Jv8dMIdrfi7/w94vEIiWvxvBwe38c4ObDmHuZ8uvWlImhW2yDPYycC5XSzvY4QnOK57yM8N+I574qAvBXjLxTTLuXpvIzwfiWmtV5sk/Xa+LtFwH4e7VxMe7sIwcsxrTuxbJdjHYZieN4mH9Ip7+UWgAEBGIQP1CCK7DQGgqUIi/vZSu09neOp1XM8G7+PFMPfxeNVqK1Ogc7B71ox3nCzvYrQ2SkA3y/GXSyCae6BfVZbxlep1du6VUyzbjhC91Tx2L0+A/DZ+H2stlyvigBcPncotsWVYns/Ve/ewIJjpQCM8AFqEIHg+Is0h9GdLsNGOwTAeiieLQJwp2H1AJwiSOce1M2013v6vkcAXiyeVwbTPN6HmE/VPhTPLedf1+iwvPN9BuBqXcv5bhcfIiynz7/vnMP14/h9Mx3O96rVOyAAg/ABahCBYED5lNx8unKn76Q+KYJb7jGdLoYNReCcHjAAX4rnlbda6tUDPN8lpD5qtpXaPIe7zL9uLJa3vNXTYo8APFIE4JkI7Km2LVKPAHw2tt9MhOUh9e4NLDhWCsAIH6AGEQi+TpHmMLkZQa0Mm5+K0PusFuzy8J0InfsF4IdFkM7fJd4oxpuMcDhoAL4eYXI8/h6Pv6/1EYCr0L1cBNiXxbQvR8gdKeZbBeDh1N5jXS3zWo8AnGL6b1L7Kd3q3U4ZHCvtPxA+QA0iEByzkQioHyOkbUe4nSvGacSwNxEe8zjVFaL3C8DXIkw/j+m8i2k8K4LnvQEDcBXcq4tXbdeC534BeDLGeRXrtFlMO4fc16l1Ia21WOZGDK8umvUqwvzb4sODbgF4IbbROfXuDSw4VgrACB+gBhEIvn6RjkaoPZ/aTycu5QtHTdeGD6fPvx88URtnPLVOOR6O+UwV8616csv7AI+n9gtrjRTjldOd7WP+nQzHukykzy9elWI7nCumN9Thuedrj4+m9gtkpSI0v1bv3sCCY6UAzLfPPVhRgzioO6CfdJ0C8GEYj/Cbe4rn1bt6B8dKARgABAIH9K8tn+69dATTzT3H+VTpla9Sl9M3rp+Z/uXOj3++cFa9AwIwACAQ8M3XZbSNwwrD6h0QgAHAQV0g4CQH4N3DCsPHUO8jXj1wrHS8BIDvJABXX1zXtC9pzZpa/yz8Xrjxd18aho8wAOeLiv13zfav7VXAsVIABoDvJAD36LnTtKNs99PsXw4dc73n3t7/stn+j2b767R3u6hdexVwrBSAOa1cgRc1iIO6HmDtpPQAf97+5syFhX/+w09/MXWs9f7Tz7u//Xf+3f+pObkPEXg/FuG3bOWb3GXDDDPsdA8bmvhHAjDfzftCdYoaRAB2QOcr1GWndmZ64V8NX1y4+/uffh7/yvWe75ucbxV1J+3diqoKxIBjpeMlwgeoQQRg+JIAfGPzxwsLi2n25+ETXO9jXj1wrHS8RPgANYgADAcMwL+8aAbfK+r9yMynzlevzo+PH3CaVwd47tB3Wuaz8XO69njebtfT3um3eTuOntDlzxefuxy/z9SaY6XjJcIHqEEEYOi7LqcXls5cXFgd5Pu96v3A8mnbjS6Pzx5wmlt9PjeHu9dHsE63I0T243qMfxB3BphP/QOCufiQofxwZzHtfaf8RbOtNturZnsf457ED07W4/f7sbzVT8dKx0uED1CDCMCg3gXgmkY6mu9Nr0dA60cObMvHMJ9Snt/D4md2OcLvbIegmR8/e8LqpgzAjQi/Z79gWwrAIHyAGuT4iuwPf/yrXw/Og7b8PEWKAPzNB+CltNc7uRbhNofG8vvOObzlnty3MW4ZgPMpvY9jWH78SWqdHv0q5rMej+XToXOv6psYP4eqbt/5zmHrWUxzowii+WfuNd2MZcmuxjy2Yto3i+XejsdXiuk+jcfy8nU7/X6pmE8170vFfHIv7vkuz52L588Vy5jHf9Bl/Be1oLzSIYhX2zS/Lo9i++V1XaiF1qXi76l4PTpt01epdYpzNhLL8Dbmd68IwNUp71dT9+/B523xPKb9sjbtlVjOzXRCe5C/9FjpeInwAWqQEyJfVOhQ7sOaL04EAvC3GoBXI+xdikD6KMJwFZo+RpgbjZBUPnc9gt1ozOd1BNtsppj/UISqPPxcBKrnRfCry/O/G8FsJpZhMuaTw9vtCGN5Wh9inOEItLvx+EiE3ZWYXx7+rphuXt+d1Pl7rWPFfEYjTH5Mre/tLsZ8++25/ZC6n+p8O8JsFWLXe7yGr+L1GY9lyoH1WgxbrgXM2QikKZb5XQTk0Qio74sQX73mebrT8cHBep/rNh7rdzOmfbV4TVLxocFcbPNv91jpeMkJ5x6sqEG+mxDc+76sCxtx0H7W8Z6tDuYIwN9DAH5QC3+78TNvi2flsSvCzWwRsqoLOY1EkKpCWCO1nwL9vhaAcqD9lDpfpCv3Ij6JkFeFrFQEqvni8bInthHhrVy36vW8GoGxdD+WuZNyPg/S572Xa6n/U4J7nXI+XwTVXgF4KrZX2Wu+GKF4vwB8vQjZqVinB/HhxMfadrw9QADuNO7DYlnW0yk4dXr/Y2Uf9zh3vASAUxAaLi6s5jf9wxcW5m0NBODvNgAvdBmeh92rDduqBeAcBN9F2+wSgMfj93fx/LJNdFi+yZjupwi0K0VQLoPpUISrjQjYr2sBvQzAyxH06vN/0kcAftYhxA1yUajt1P2CWncj8O8XgK/F9qgv/8s+AvBybJdO697oUCdXBwjAKx22w83i+Qf9LjUAgAAMAvBAcuC71CFc7qZWr2oOL3eK4cNFIFrpEBCrHtbR1H7qa4qw3CkAD0V4K6/8PdQl/FaBeShCbz51tvr+cT1Q3Ywgdz61brm00yUA30yfX5V6NHW/FVE5n0fp8+/mPunwWDf5+c+Lv6divYbiQ4M7XQLwePFazEbIL+XtM9YlAF8qAvCt1OopLtd9JNpu1EVlcYAAfCe1nyVQ1cEzARgAEIBBAD5OTyP4VEFzLIJJGQRXI4RVPaw5aG7E7zMRuqrvus6lVu9wFaQnirD2tgjMVQCupvs8hlVBNZ86+y51vldwfrzslX5RhMTnRah9EMMq11J77/bD1PqecSNC+KUiPL6phf96AL5ZrPd2sa6TsV36vS9uI57/MOZ7Pl6D7dj2VQi/EgF+tAi1VQAejmE3iw8QnhXb+3ZMcyjaahGAz+6z7mvFdsrzeTlAAK6+H32uqIM83+sCMAAgAIMAfJzGI9zsFu1lar94U3VP2uoqypupvTfwdmqdXvwqtX/H9kmEsvUIzQ9S67umIxGIdyMkjce838U4Wz0C5OWY7usYb60I0rdimk9jParpvY7leVmExKsR/F4Xf1frshPTGOmyDEsxnyoY3o3nvqoF0X6djbBencb8Kf4uw/5QrOv72M6PYtxG8YFE9Tq9i3UtrxD9JpatOm18q5j/fLFNd2JbDRd1Ul3peytez/UB1m2xtm3u1T5IcHwBAARgEICPTXWV5k63salOEx5Jnb8vXD6/W8hu9Jj3xIDjpyIMNlL7BbDK5RmpjdftVOaRWsgd6rEt6sZS+0Wnqm00fAivRbVMkxGu69uo1/J12y5pn22x37pP9HjufoZr6/WNHSt/mcv7hh9++ospe1tOK1fgRQ1CLsRm8HVQ51sKwO57PbDye7JAxwDsw2K+neOke7CiBgG+Ae57fWD59Ns5FQQCMMIHqEGAUxaC3fcaEIBB+EANAtjxehML2HcgfAgfqEEAb2IB7DsQPkANAnwjhi/cWPiKF33L936t7gFbXkU4X5k3358133Yn31rn7AnYVPl2QeMdfh9EXtcqLJyN6VQ/95vnUDx3acB5H3RZv8R4j3U6CcuX5dsnTR1CLRxEfs0vdxl2+QjrfUgABuEDNQifB4K4HLmrQMORexKhcLV4LN8CJ9+79W08nu9L+yGC39eU7wU72+H3QTTS3n10qxC1Wfzcb575tkDvYpuMHXC5j8tsar/f7klbvpS+7ErfX7rMOTBW9xTOt1l6Xgw7qnsE59p7IQCD8IEaBAd1+Lqhcjp+5h613EO10WwPU3tvVQ4bn9Jer923EoDz+j0ufh5VYPtaAfOkL9/XDMC9Piw4qgA8yIcSfR4rb1z1YTGnnXuwogZBAIbjDiGTqdWrmU///Nhsox3GnY9xU4ybQ/JmvKl/FuEyy2/GVyLc5F7k3Jtcno6bn/uoGFb+n+dTsddimusRzvcLwLkH+0ExvVu15b4dy5mD/c0iAJ+PZZ0u1qvuSYyTe7+3Y74rXYL1sxie57PQZbnXU/tpv0vF+s/Hsr5sttcxzSqMvYmWbw11vfZ3J1Ox7JVLMd2t2L7na8t3N+a5Ga9bt1N18+P3Y7z6uLl27sTwtzG9K8Vzzxavbf7A4WktAC/EttuK+ih72adj+d/G9N91CcD3a7X2uFZfj+JDnMvF67gRNb8eHwLln/eKZX2a2k+3vtxjWz7p8vqO1+YDACAAwwmQA8yrPsZ7EuFiLN7cr0VQSKnVW3w3QtzNWqh+UYSKHGx2IlTkv/Op1osRanOQeZ9a38fsFoDXiumdi2B2swiVW/H4RKzb7gDbo5rPWMxjJXX+7umzCE0jEbA+FMGoXNbdWnAre0GXYztV90BuxPjPIqDfjOk+iW1yM7ZPJ7Op1dtYLc/VeA2q6YwXy7cZ85iMkNntdPeHEf4a0V7Gelfb+mOE+Easz/sIyEMxj7uxDPNRI8u112kmhj8s6rCqi/kYdqfDdiwD57PieZ9S67TjsZhO9T3wKohei0DdiOVcjw87LsX2WE+trwhU23IuluVWh23Z6fUdqs0HAEAAhhNgOfXXQzWdWj10w7XnzUaoLe3GG/+x+L3s3ZuJYbfT59+RfBqBp1sAbnSYXg4ab+L39dTeIzxzwABcD6t1axFMzxdhKx0gAK8Vw6p1O1f7+2zt7/0CcA6Tj2rDX8T2rpav7Km9Xmy/0kgEyqnafHaKEPu2Nn71us8UYbjyvFj318WHFlVNfYx1vxlBu9vrUjobgbS6YNnTmM5wrNdasazrHbZVVTP1nulq3Ed9bMtur299PgAAAjDfn99dvDFzgr7Hl8NitwtCNVLrStE56OWetncRgDZ6BIoyAM/2CG2rEV62au1+jwA8G6Gs/pzNYrzLHULlYQfgyQhXn2J7PIgAOGgAXu2wrI19/t4vAK93WO7VYl5bqb1XstqmnV7/3Q7beqtDqKy/7vMdauJBsVx52HaH6U532C7VOs12Wfe3MWw1PgzZiL+fpNap6fsF4PLYU47bbVs+EoABAAEYTl+9T0Zo6fSd2Bwk8umuQxFW8umsVU/nzT4DcDX98pZLM9Fy0H1ae95YlyBZ/X4+wlo5veFiufIyL3ZYv8MOwNUFxPKyzkUIu9tHAH5yDAH4SfEhQuVpLXyW32O90uVDkPGY33htW4/3EYCvRM2kLuu+GWG1HrizpdTeM5697hGA78W2345luxftfZdlHSQAP02tU767bctyuR4LwACAAAwnu95zMHlThODhCFA5QEyk1mnM1RWhRyKQ9BOAU4TDm8W0q5Cap1ed9loFrhxirvcIwDl0vkvt31ldLQJT9Z3mKkSvHFEA3qwF7bUuAbj8fnLeljvHEICvF2EwxfbN23m6WL5qvnl7vkidL/SVYls+LP6+H6/ffgF4JNb1WrHu74t1X4kaGilC+MdY5uq05qli3XZ7BOCZqIlquS7H8192CbX107N7BeBu27L6AKG8CNtEjFsG4O10iPcC/vHCwhVXgea0cwVe1CDkQmwGAQd1BOCvJoeQR/HGfjt+bqT2XsJ7ESrW403/3eLN/X4B+HyE4I14zmoRCqoLNL2KUFLejqnbRbCmY3qbqXX14fEi0D2J8JWX8/kRBeAq3GzEMuTtMtphGtdje27F8hxHD3D1er2PbbNdC+vVVZnfRnB8XgTRusnUulJztb0n+wjAVdDcjmWorpa9XNTc03idXsfP8mrOi8Xyb8S26/ZGZSiev1J8yPKx9iFJuawjsd7VmQ+9AnB9W+7UtuVc8fq+rb2+1Qc69V70b2nfAYPXsXuwogYBBOATYjjCS7c362Ppy65o20jtF4uqz3d0wOlNROtk/LBCRw9D+2yv8gOGRjrEnsA+AnA53+Eer+f4IWzrfrbR8D41NdRjux3VazdIffTalr1e36HDrEMBGOED1CCAAMz3Lp+WW95GCPsOED5ADQJ4E8s3Kd+SJ5/GPG1T2HeA8AFqEMCbWMC+A4QPUIMAx234wo0FF30DBGCED1CDfK+BIC5HLhAAgACM8AFqEAd1gK+vvNJvvt/s2SOYRyPtfa837w/zrYQO44PBfIuh8S9c38MclwMdK29c9WExp517sKIGQQAGTq611H4f3hfFsPr9Yw/LVkz7Tup9L+JBpznogb6+vr3kW1i9Vi4AAAIwcHrtFgF4Nn1+r92jnudhhupBA/Ag69uI5QYAQAAGvqJ8au79ZnvbbJvNttJsI8XwW832JoY/KIY9iVCX76+bT3feaLaPaa93NsV0LhfjLjbbywiNj2rzWIx55PnPxzQ6nZK8XpvnUmr1Mle/P415rNWC8rV43lbMa77PALwUy/U2lns8Wn1982OPY7ytWOdqHV7Fclfrlbf5nWK73q9tDwAAAVgA5nvwu4s3ZnyP71jlgPsiglkjgt1SLfydi+FPImBmExHqZiK85YD5rgid5SnQWzGd82nvO7s59C0XwTQ/bzrmsZa69/I2avMsT4HOv28326W0993j58WyTkVYrZ53pTaPbgF4LkJqo1i2hxFg6+v7IgLyaDz2Kj4ESDHfan75uffS3inR1XZ9Fs8FAEAARr1zxAF4I4LjcAS4oSIYXi3GHYsgNxZ/9zoFuh6AF4th9yKwVsHxdoeQ2+iyvOWwegBeKcabj/CaImSer81jpwi9vQLwVvwciTbcZX1nY9ulGO9hsY7VOlXyvC8Xf+fA/inpBQYAEAhQ7xypHLpy7+OHtNdLmnsjJ4uw+S6CXtnOHyAAlwFzuQiHVcDsFnIHCcDLtQBcLc9QDMtB/31qnZK8XwCuTg/fiYCaw/p0jwD8PLZX7one7BKAR3ps1wnlCAB893IQcEooAjBHGIBHIuzlU3Xzab4vY1gOxZdq4090CaMHDcB5XjeLYeNHEIDzqdxvI7gPFdPZLwBXPeIpnvs4gmt9fUdjW90qxr+buvcAf0rtPdJDwi8AAHyHhi/cWPjx4i8rPvA5NvlU3afF30tFAF6NQDxUhMr3qXWqbg51U0Ug3C7G7TcA34xwOhGB89ERBOC8js+KYQt9BuC8LV4V63StFoC3i/BaLlc+RXyz2K5VAK6227MYVk33Vm3bAQAAcARyj+vrCIGvI4xOF0HuRYSz16l1kalKdcGq+ZjOTmp9R7jfAJxDX/7u7odoj1L794wPIwBPxbJvRHsSP+f3CcAjsY7bEYRz+L1SbLftYlkfx/qvx7TzFbOr7yAPx3bN456P576M6b2JnzNKEQAA4HhMpO69rmOpdQXjTs9LRZgdH3C+OfhNFn/nKyN/PIL1G4p1GD3ghwSd1r++vuOp9z2KJ7pMFwAAgO9AvgJ0Pl34crTcM/rQZgEAAOBbk3tR8y2Snke7lXwXFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEPz/wMn95qJV0/ZuQAAAABJRU5ErkJggg=="></image></g></g></svg>
+
diff --git a/doc/images/Keep_manifests.svg b/doc/images/Keep_manifests.svg
new file mode 100644 (file)
index 0000000..66a8162
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 960.0 540.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="g1586814eb6_0_6.0"><path d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#g1586814eb6_0_6.0)"><path fill="#ffffff" d="m0 0l960.0 0l0 540.0l-960.0 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m32.72441 46.721786l894.55115 0l0 60.125984l-894.55115 0z" fill-rule="nonzero"></path><path fill="#000000" d="m63.47441 82.28053l3.5 0.875q-1.09375 4.328125 -3.96875 6.59375q-2.859375 2.265625 -6.984375 2.265625q-4.28125 0 -6.96875 -1.734375q-2.6875 -1.75 -4.09375 -5.046875q-1.390625 -3.3125 -1.390625 -7.109375q0 -4.140625 1.578125 -7.21875q1.578125 -3.078125 4.5 -4.671875q2.921875 -1.609375 6.421875 -1.609375q3.96875 0 6.671875 2.03125q2.71875 2.015625 3.796875 5.6875l-3.453125 0.8125q-0.921875 -2.890625 -2.6875 -4.203125q-1.75 -1.328125 -4.40625 -1.328125q-3.046875 0 -5.09375 1.46875q-2.046875 1.453125 -2.890625 3.921875q-0.828125 2.46875 -0.828125 5.09375q0 3.375 0.984375 5.890625q0.984375 2.515625 3.0625 3.765625q2.078125 1.25 4.5 1.25q2.953125 0 4.984375 -1.6875q2.046875 -1.703125 2.765625 -5.046875zm6.441559 -0.3125q0 -5.328125 2.953125 -7.890625q2.484375 -2.140625 6.03125 -2.140625q3.96875 0 6.46875 2.59375q2.515625 2.59375 2.515625 7.171875q0 3.703125 -1.109375 5.828125q-1.109375 2.109375 -3.234375 3.296875q-2.125 1.171875 -4.640625 1.171875q-4.015625 0 -6.5 -2.578125q-2.484375 -2.59375 -2.484375 -7.453125zm3.34375 0q0 3.6875 1.59375 5.53125q1.609375 1.828125 4.046875 1.828125q2.421875 0 4.03125 -1.84375q1.609375 -1.84375 1.609375 -5.625q0 -3.5625 -1.625 -5.390625q-1.609375 -1.828125 -4.015625 -1.828125q-2.4375 0 -4.046875 1.828125q-1.59375 1.8125 -1.59375 5.5zm18.541382 9.59375l0 -26.484375l3.265625 0l0 26.484375l-3.265625 0zm8.293121 0l0 -26.484375l3.265625 0l0 26.484375l-3.265625 0zm21.511871 -6.171875l3.359375 0.40625q-0.796875 2.953125 -2.953125 4.578125q-2.140625 1.625 -5.484375 1.625q-4.21875 0 -6.6875 -2.59375q-2.453125 -2.59375 -2.453125 -7.28125q0 -4.828125 2.484375 -7.5q2.5 -2.6875 6.46875 -2.6875q3.859375 0 6.296875 2.625q2.4375 2.625 2.4375 7.375q0 0.28125 -0.015625 0.859375l-14.3125 0q0.171875 3.171875 1.78125 4.859375q1.609375 1.671875 4.015625 1.671875q1.78125 0 3.046875 -0.9375q1.265625 -0.953125 2.015625 -3.0zm-10.6875 -5.265625l10.71875 0q-0.21875 -2.421875 -1.234375 -3.625q-1.546875 -1.890625 -4.015625 -1.890625q-2.25 0 -3.78125 1.5q-1.515625 1.5 -1.6875 4.015625zm30.822632 4.40625l3.203125 0.421875q-0.515625 3.296875 -2.6875 5.171875q-2.15625 1.875 -5.296875 1.875q-3.9375 0 -6.328125 -2.578125q-2.390625 -2.578125 -2.390625 -7.375q0 -3.109375 1.015625 -5.4375q1.03125 -2.34375 3.140625 -3.5q2.109375 -1.171875 4.578125 -1.171875q3.125 0 5.109375 1.59375q2.0 1.578125 2.546875 4.484375l-3.15625 0.484375q-0.453125 -1.9375 -1.609375 -2.90625q-1.140625 -0.984375 -2.765625 -0.984375q-2.453125 0 -4.0 1.765625q-1.53125 1.765625 -1.53125 5.578125q0 3.859375 1.484375 5.625q1.484375 1.75 3.875 1.75q1.90625 0 3.1875 -1.171875q1.28125 -1.1875 1.625 -3.625zm13.2578125 4.125l0.46875 2.875q-1.375 0.28125 -2.46875 0.28125q-1.765625 0 -2.75 -0.5625q-0.96875 -0.5625 -1.375 -1.46875q-0.390625 -0.90625 -0.390625 -3.84375l0 -11.03125l-2.375 0l0 -2.53125l2.375 0l0 -4.75l3.234375 -1.953125l0 6.703125l3.28125 0l0 2.53125l-3.28125 0l0 11.21875q0 1.390625 0.171875 1.796875q0.171875 0.390625 0.5625 0.625q0.390625 0.234375 1.109375 0.234375q0.546875 0 1.4375 -0.125zm3.2772064 -19.84375l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm7.0743713 -9.59375q0 -5.328125 2.953125 -7.890625q2.484375 -2.140625 6.03125 -2.140625q3.96875 0 6.46875 2.59375q2.515625 2.59375 2.515625 7.171875q0 3.703125 -1.109375 5.828125q-1.109375 2.109375 -3.234375 3.296875q-2.125 1.171875 -4.640625 1.171875q-4.015625 0 -6.5 -2.578125q-2.484375 -2.59375 -2.484375 -7.453125zm3.34375 0q0 3.6875 1.59375 5.53125q1.609375 1.828125 4.046875 1.828125q2.421875 0 4.03125 -1.84375q1.609375 -1.84375 1.609375 -5.625q0 -3.5625 -1.625 -5.390625q-1.609375 -1.828125 -4.015625 -1.828125q-2.4375 0 -4.046875 1.828125q-1.59375 1.8125 -1.59375 5.5zm18.619507 9.59375l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm19.463257 -5.734375l3.21875 -0.5q0.265625 1.9375 1.5 2.96875q1.234375 1.03125 3.46875 1.03125q2.234375 0 3.3125 -0.90625q1.09375 -0.921875 1.09375 -2.15625q0 -1.09375 -0.96875 -1.734375q-0.65625 -0.4375 -3.3125 -1.09375q-3.578125 -0.90625 -4.96875 -1.5625q-1.375 -0.671875 -2.09375 -1.828125q-0.703125 -1.171875 -0.703125 -2.578125q0 -1.28125 0.578125 -2.375q0.59375 -1.09375 1.59375 -1.8125q0.765625 -0.5625 2.078125 -0.953125q1.3125 -0.390625 2.8125 -0.390625q2.25 0 3.953125 0.65625q1.71875 0.65625 2.53125 1.765625q0.8125 1.109375 1.109375 2.96875l-3.171875 0.4375q-0.21875 -1.484375 -1.265625 -2.3125q-1.03125 -0.84375 -2.921875 -0.84375q-2.25 0 -3.203125 0.75q-0.953125 0.734375 -0.953125 1.734375q0 0.625 0.390625 1.140625q0.40625 0.515625 1.25 0.859375q0.484375 0.1875 2.875 0.828125q3.453125 0.921875 4.8125 1.515625q1.359375 0.578125 2.140625 1.703125q0.78125 1.125 0.78125 2.78125q0 1.625 -0.953125 3.0625q-0.953125 1.4375 -2.75 2.234375q-1.78125 0.78125 -4.03125 0.78125q-3.75 0 -5.703125 -1.546875q-1.953125 -1.5625 -2.5 -4.625zm20.867188 -9.75l0 -3.703125l3.703125 0l0 3.703125l-3.703125 0zm0 15.484375l0 -3.703125l3.703125 0l0 3.703125l-3.703125 0zm20.148163 0l0 -26.484375l5.265625 0l6.28125 18.75q0.859375 2.625 1.265625 3.921875q0.4375 -1.4375 1.40625 -4.25l6.34375 -18.421875l4.703125 0l0 26.484375l-3.375 0l0 -22.171875l-7.6875 22.171875l-3.171875 0l-7.65625 -22.546875l0 22.546875l-3.375 0zm43.29773 -2.359375q-1.796875 1.53125 -3.46875 2.171875q-1.671875 0.625 -3.59375 0.625q-3.15625 0 -4.859375 -1.546875q-1.6875 -1.546875 -1.6875 -3.953125q0 -1.40625 0.640625 -2.5625q0.640625 -1.171875 1.671875 -1.875q1.046875 -0.703125 2.34375 -1.0625q0.953125 -0.265625 2.890625 -0.5q3.9375 -0.46875 5.796875 -1.109375q0.015625 -0.671875 0.015625 -0.859375q0 -1.984375 -0.921875 -2.796875q-1.25 -1.09375 -3.703125 -1.09375q-2.296875 0 -3.390625 0.796875q-1.09375 0.796875 -1.609375 2.84375l-3.1875 -0.4375q0.4375 -2.03125 1.421875 -3.28125q1.0 -1.265625 2.875 -1.9375q1.890625 -0.6875 4.359375 -0.6875q2.46875 0 4.0 0.578125q1.53125 0.578125 2.25 1.453125q0.734375 0.875 1.015625 2.21875q0.15625 0.828125 0.15625 3.0l0 4.328125q0 4.546875 0.203125 5.75q0.21875 1.1875 0.828125 2.296875l-3.390625 0q-0.5 -1.015625 -0.65625 -2.359375zm-0.265625 -7.265625q-1.765625 0.71875 -5.3125 1.21875q-2.0 0.296875 -2.84375 0.65625q-0.828125 0.359375 -1.28125 1.0625q-0.4375 0.6875 -0.4375 1.53125q0 1.3125 0.984375 2.1875q0.984375 0.859375 2.875 0.859375q1.875 0 3.34375 -0.828125q1.46875 -0.828125 2.15625 -2.25q0.515625 -1.09375 0.515625 -3.25l0 -1.1875zm8.510132 9.625l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm20.775757 -22.75l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm9.058746 0l0 -16.65625l-2.875 0l0 -2.53125l2.875 0l0 -2.046875q0 -1.921875 0.34375 -2.859375q0.46875 -1.265625 1.640625 -2.046875q1.1875 -0.796875 3.328125 -0.796875q1.375 0 3.03125 0.328125l-0.484375 2.828125q-1.015625 -0.171875 -1.921875 -0.171875q-1.484375 0 -2.09375 0.640625q-0.609375 0.625 -0.609375 2.359375l0 1.765625l3.734375 0l0 2.53125l-3.734375 0l0 16.65625l-3.234375 0zm22.730347 -6.171875l3.359375 0.40625q-0.796875 2.953125 -2.953125 4.578125q-2.140625 1.625 -5.484375 1.625q-4.21875 0 -6.6875 -2.59375q-2.453125 -2.59375 -2.453125 -7.28125q0 -4.828125 2.484375 -7.5q2.5 -2.6875 6.46875 -2.6875q3.859375 0 6.296875 2.625q2.4375 2.625 2.4375 7.375q0 0.28125 -0.015625 0.859375l-14.3125 0q0.171875 3.171875 1.78125 4.859375q1.609375 1.671875 4.015625 1.671875q1.78125 0 3.046875 -0.9375q1.265625 -0.953125 2.015625 -3.0zm-10.6875 -5.265625l10.71875 0q-0.21875 -2.421875 -1.234375 -3.625q-1.546875 -1.890625 -4.015625 -1.890625q-2.25 0 -3.78125 1.5q-1.515625 1.5 -1.6875 4.015625zm17.010132 5.703125l3.21875 -0.5q0.265625 1.9375 1.5 2.96875q1.234375 1.03125 3.46875 1.03125q2.234375 0 3.3125 -0.90625q1.09375 -0.921875 1.09375 -2.15625q0 -1.09375 -0.96875 -1.734375q-0.65625 -0.4375 -3.3125 -1.09375q-3.578125 -0.90625 -4.96875 -1.5625q-1.375 -0.671875 -2.09375 -1.828125q-0.703125 -1.171875 -0.703125 -2.578125q0 -1.28125 0.578125 -2.375q0.59375 -1.09375 1.59375 -1.8125q0.765625 -0.5625 2.078125 -0.953125q1.3125 -0.390625 2.8125 -0.390625q2.25 0 3.953125 0.65625q1.71875 0.65625 2.53125 1.765625q0.8125 1.109375 1.109375 2.96875l-3.171875 0.4375q-0.21875 -1.484375 -1.265625 -2.3125q-1.03125 -0.84375 -2.921875 -0.84375q-2.25 0 -3.203125 0.75q-0.953125 0.734375 -0.953125 1.734375q0 0.625 0.390625 1.140625q0.40625 0.515625 1.25 0.859375q0.484375 0.1875 2.875 0.828125q3.453125 0.921875 4.8125 1.515625q1.359375 0.578125 2.140625 1.703125q0.78125 1.125 0.78125 2.78125q0 1.625 -0.953125 3.0625q-0.953125 1.4375 -2.75 2.234375q-1.78125 0.78125 -4.03125 0.78125q-3.75 0 -5.703125 -1.546875q-1.953125 -1.5625 -2.5 -4.625zm27.070312 2.828125l0.46875 2.875q-1.375 0.28125 -2.46875 0.28125q-1.765625 0 -2.75 -0.5625q-0.96875 -0.5625 -1.375 -1.46875q-0.390625 -0.90625 -0.390625 -3.84375l0 -11.03125l-2.375 0l0 -2.53125l2.375 0l0 -4.75l3.234375 -1.953125l0 6.703125l3.28125 0l0 2.53125l-3.28125 0l0 11.21875q0 1.390625 0.171875 1.796875q0.171875 0.390625 0.5625 0.625q0.390625 0.234375 1.109375 0.234375q0.546875 0 1.4375 -0.125zm1.9647217 -2.828125l3.21875 -0.5q0.265625 1.9375 1.5 2.96875q1.234375 1.03125 3.46875 1.03125q2.234375 0 3.3125 -0.90625q1.09375 -0.921875 1.09375 -2.15625q0 -1.09375 -0.96875 -1.734375q-0.65625 -0.4375 -3.3125 -1.09375q-3.578125 -0.90625 -4.96875 -1.5625q-1.375 -0.671875 -2.09375 -1.828125q-0.703125 -1.171875 -0.703125 -2.578125q0 -1.28125 0.578125 -2.375q0.59375 -1.09375 1.59375 -1.8125q0.765625 -0.5625 2.078125 -0.953125q1.3125 -0.390625 2.8125 -0.390625q2.25 0 3.953125 0.65625q1.71875 0.65625 2.53125 1.765625q0.8125 1.109375 1.109375 2.96875l-3.171875 0.4375q-0.21875 -1.484375 -1.265625 -2.3125q-1.03125 -0.84375 -2.921875 -0.84375q-2.25 0 -3.203125 0.75q-0.953125 0.734375 -0.953125 1.734375q0 0.625 0.390625 1.140625q0.40625 0.515625 1.25 0.859375q0.484375 0.1875 2.875 0.828125q3.453125 0.921875 4.8125 1.515625q1.359375 0.578125 2.140625 1.703125q0.78125 1.125 0.78125 2.78125q0 1.625 -0.953125 3.0625q-0.953125 1.4375 -2.75 2.234375q-1.78125 0.78125 -4.03125 0.78125q-3.75 0 -5.703125 -1.546875q-1.953125 -1.5625 -2.5 -4.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m32.08399 481.27823l894.5512 0l0 46.015717l-894.5512 0z" fill-rule="nonzero"></path><path fill="#000000" d="m46.005863 508.1982l0 -12.0l-4.46875 0l0 -1.59375l10.765625 0l0 1.59375l-4.5 0l0 12.0l-1.796875 0zm14.474106 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547596 2.265625l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.2187538 -1.328125 -1.2187538 -3.796875q0 -1.59375 0.5156288 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.890625 3.609375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm10.375717 0l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm10.391342 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm10.566696 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 2.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.047592 4.9375l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm8.6875 -2.9375l1.6562424 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.7031174 -0.34375 -1.0781174 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.8281174 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9374924 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.999992 6.71875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.610092 1.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547592 2.265625l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.21875 0.671875l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.46875 -5.015625l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm0 7.953125l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0z" fill-rule="nonzero"></path><path fill="#0097a7" d="m186.46445 508.1982l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm14.031967 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm5.183304 0l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270538 5.28125l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.188217 1.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.46875 -5.015625l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm0 7.953125l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm3.4645538 0.234375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm5.183304 0l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm12.823929 -0.234375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm16.016342 1.75l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm11.844482 5.875l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm7.0625 0l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm11.152039 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.9626465 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.03125 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469482 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.641357 0q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm8.610077 1.984375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.46875 2.9375l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm4.089569 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.266327 4.921875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.931427 0.8125l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625305 -2.5 0.5625305q-1.765625 0 -2.859375 -0.7969055q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm8.047607 5.34375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm6.4332886 3.546875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.844482 4.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.6032715 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 -6.734375l0 -1.9375l1.65625 0l0 1.9375l-1.65625 0zm-2.125 15.4844055l0.3125 -1.4219055q0.5 0.125 0.796875 0.125q0.515625 0 0.765625 -0.34375q0.25 -0.328125 0.25 -1.6875l0 -10.359375l1.65625 0l0 10.390625q0 1.828125 -0.46875 2.546875q-0.59375 0.9219055 -2.0 0.9219055q-0.671875 0 -1.3125 -0.171875zm13.019836 -7.0000305l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547577 2.265625l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm6.546875 2.109375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.8551941 -1.4375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm8.7499695 3.171875l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm12.870789 -1.453125q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.962677 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.03125 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469452 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm8.641357 0q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm8.610107 1.984375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.7812805 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.8437805 -0.46875 -2.5625305 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375305 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.1562805 0 -1.6406555 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.4687805 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.9219055 0 -2.9375305 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm8.7500305 3.171875l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm8.261414 -0.234375l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.660461 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.1448364 0l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm9.328125 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm2.8791504 0.234375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm6.5739746 -0.234375l0 -13.59375l1.796875 0l0 6.734375l6.765625 -6.734375l2.4375 0l-5.703125 5.5l5.953125 8.09375l-2.375 0l-4.84375 -6.890625l-2.234375 2.171875l0 4.71875l-1.796875 0zm19.052917 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.860046 2.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm7.3288574 8.65625l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm11.906982 -3.78125l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm21.978333 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0787964 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm10.391357 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.5355225 0l0 -8.546875l-1.484375 0l0 -1.3125l1.484375 0l0 -1.046875q0 -0.984375 0.171875 -1.46875q0.234375 -0.65625 0.84375 -1.046875q0.609375 -0.40625 1.703125 -0.40625q0.703125 0 1.5625 0.15625l-0.25 1.46875q-0.515625 -0.09375 -0.984375 -0.09375q-0.765625 0 -1.078125 0.328125q-0.3125 0.3125 -0.3125 1.203125l0 0.90625l1.921875 0l0 1.3125l-1.921875 0l0 8.546875l-1.65625 0zm11.526978 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm13.65625 1.4375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm-0.0041503906 5.28125l0 -1.21875l11.0625 0l0 1.21875l-11.0625 0zm12.313232 -3.78125l0 -8.546875l-1.484375 0l0 -1.3125l1.484375 0l0 -1.046875q0 -0.984375 0.171875 -1.46875q0.234375 -0.65625 0.84375 -1.046875q0.609375 -0.40625 1.703125 -0.40625q0.703125 0 1.5625 0.15625l-0.25 1.46875q-0.515625 -0.09375 -0.984375 -0.09375q-0.765625 0 -1.078125 0.328125q-0.3125 0.3125 -0.3125 1.203125l0 0.90625l1.921875 0l0 1.3125l-1.921875 0l0 8.546875l-1.65625 0zm4.1519775 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.266357 4.921875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.2283936 0l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm21.978271 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm7.7351074 3.4375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125z" fill-rule="nonzero"></path><path stroke="#0097a7" stroke-width="1.3671875" stroke-linecap="butt" d="m185.21445 510.1761l560.99927 0" fill-rule="nonzero"></path><a xlink:href="https://www.google.com/url?q=https://dev.arvados.org/projects/arvados/wiki/Keep_manifest_format&amp;sa=D&amp;ust=1478895969188000&amp;usg=AFQjCNHMNIzr5ezz4laFKPqTOrFHC9sgsA" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m185.21445 512.15173l0 -20.84253l560.99927 0l0 20.84253z" fill-rule="evenodd"></path></a><path fill="#000000" fill-opacity="0.0" d="m178.12337 46.721786l600.2048 0l0 473.36218l-600.2048 0z" fill-rule="nonzero"></path><g transform="matrix(0.6538178477690288 0.0 0.0 0.6538152230971128 178.12336036745407 46.72178477690289)"><clipPath id="g1586814eb6_0_6.1"><path d="m0 1.4210855E-14l918.0 0l0 724.0l-918.0 0z" clip-rule="nonzero"></path></clipPath><image clip-path="url(#g1586814eb6_0_6.1)" fill="#000" width="918.0" height="724.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"></image></g></g></svg>
+
diff --git a/doc/images/Keep_reading_writing_block.svg b/doc/images/Keep_reading_writing_block.svg
new file mode 100644 (file)
index 0000000..3333eab
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 960.0 540.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="g150061aa58_0_0.0"><path d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#g150061aa58_0_0.0)"><path fill="#ffffff" d="m0 0l960.0 0l0 540.0l-960.0 0z" fill-rule="nonzero"></path><path fill="#eeeeee" d="m312.64752 161.47145c-1.304718 -6.8049164 2.9787598 -13.541397 11.032776 -17.350906c8.053986 -3.8095093 18.466064 -4.023941 26.817963 -0.5523224l0 0c2.9583435 -3.9569397 8.373169 -6.6889496 14.606506 -7.3696136c6.2333374 -0.6806488 12.55304 0.769989 17.047424 3.9131317l0 0c2.5202026 -3.5875702 7.46875 -5.9979553 13.08963 -6.375824c5.6208496 -0.37786865 11.1185 1.3302612 14.542084 4.5182495l0 0c4.5532227 -3.8025818 11.797455 -5.40361 18.598114 -4.110321c6.800659 1.2933044 11.936279 5.2486267 13.184662 10.1545105l0 0c5.5782166 1.0799713 10.224731 3.8253632 12.739075 7.5268555c2.5143433 3.7014923 2.6498718 7.995987 0.3715515 11.773926l0 0c5.4933167 5.074188 6.778412 11.835541 3.375702 17.760818c-3.40271 5.9252777 -10.982025 10.124237 -19.909393 11.029907c-0.062927246 5.561264 -4.359955 10.664215 -11.234833 13.341904c-6.874878 2.6776886 -15.253998 2.5119781 -21.907654 -0.43325806c-2.8341675 6.660553 -10.811493 11.56134 -20.485474 12.585007c-9.673981 1.0236511 -19.310303 -2.013321 -24.745697 -7.798828c-6.662628 2.851654 -14.657257 3.6731415 -22.18042 2.279129c-7.5231934 -1.3939972 -13.941193 -4.8860626 -17.806213 -9.688431l0 0c-6.808319 0.565506 -13.391052 -1.9381409 -16.481201 -6.268387c-3.0901794 -4.330246 -2.0299683 -9.565308 2.6544495 -13.107056l0 0c-6.073517 -2.53714 -9.172607 -7.571686 -7.6812134 -12.478317c1.491394 -4.9066315 7.2353516 -8.573486 14.236572 -9.08844z" fill-rule="nonzero"></path><path fill="#eeeeee" d="m347.71796 228.58267c0 1.2978516 -1.052124 2.3499603 -2.3499756 2.3499603c-1.297821 0 -2.349945 -1.0521088 -2.349945 -2.3499603c0 -1.2978363 1.052124 -2.349945 2.349945 -2.349945c1.2978516 0 2.3499756 1.0521088 2.3499756 2.349945z" fill-rule="nonzero"></path><path fill="#eeeeee" d="m351.94028 225.65413c0 2.5956879 -2.1042175 4.6999207 -4.69989 4.6999207c-2.5957031 0 -4.6999207 -2.1042328 -4.6999207 -4.6999207c0 -2.5956879 2.1042175 -4.6999054 4.6999207 -4.6999054c2.5956726 0 4.69989 2.1042175 4.69989 4.6999054z" fill-rule="nonzero"></path><path fill="#eeeeee" d="m358.6943 218.76582c0 3.8935394 -3.1563416 7.0498657 -7.0498657 7.0498657c-3.8935242 0 -7.0498657 -3.1563263 -7.0498657 -7.0498657c0 -3.8935394 3.1563416 -7.0498657 7.0498657 -7.0498657c3.8935242 0 7.0498657 3.1563263 7.0498657 7.0498657z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m315.61838 184.52805l0 0c-3.3113708 0.18397522 -6.6223755 -0.35913086 -9.488464 -1.5564117m17.860107 18.588898c-1.331543 0.3761902 -2.7273254 0.6266632 -4.151306 0.7449341m39.921875 7.4392548l0 0c-1.0014954 -1.0660095 -1.8399963 -2.2051392 -2.5012207 -3.3979645m48.75699 -5.0752716c-0.14724731 1.264389 -0.48202515 2.5141602 -0.99871826 3.7284546m20.857605 -26.765305l0 0c7.5073853 2.592987 12.245026 8.014023 12.17807 13.934677m16.547363 -28.776062c-1.2158203 2.0160675 -3.0718994 3.8045044 -5.422699 5.225067m-7.589813 -24.612915l0 0c0.20715332 0.81414795 0.30303955 1.6405334 0.28631592 2.4677124m-34.918304 -5.346176l0 0c0.7065735 -1.1384583 1.642334 -2.198471 2.7781372 -3.1470337m-28.761261 4.6465454l0 0c0.28826904 -0.9408264 0.74020386 -1.8525238 1.345459 -2.7141113m-31.83963 3.6362305l0 0c1.767273 0.7345886 3.4022217 1.6187592 4.8689575 2.6330566m-41.849762 18.061127l0 0c-0.3857727 -0.9061127 -0.6699219 -1.8324738 -0.84973145 -2.7703857" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m312.64752 161.47145c-1.304718 -6.8049164 2.9787598 -13.541397 11.032776 -17.350906c8.053986 -3.8095093 18.466064 -4.023941 26.817963 -0.5523224l0 0c2.9583435 -3.9569397 8.373169 -6.6889496 14.606506 -7.3696136c6.2333374 -0.6806488 12.55304 0.769989 17.047424 3.9131317l0 0c2.5202026 -3.5875702 7.46875 -5.9979553 13.08963 -6.375824c5.6208496 -0.37786865 11.1185 1.3302612 14.542084 4.5182495l0 0c4.5532227 -3.8025818 11.797455 -5.40361 18.598114 -4.110321c6.800659 1.2933044 11.936279 5.2486267 13.184662 10.1545105l0 0c5.5782166 1.0799713 10.224731 3.8253632 12.739075 7.5268555c2.5143433 3.7014923 2.6498718 7.995987 0.3715515 11.773926l0 0c5.4933167 5.074188 6.778412 11.835541 3.375702 17.760818c-3.40271 5.9252777 -10.982025 10.124237 -19.909393 11.029907c-0.062927246 5.561264 -4.359955 10.664215 -11.234833 13.341904c-6.874878 2.6776886 -15.253998 2.5119781 -21.907654 -0.43325806c-2.8341675 6.660553 -10.811493 11.56134 -20.485474 12.585007c-9.673981 1.0236511 -19.310303 -2.013321 -24.745697 -7.798828c-6.662628 2.851654 -14.657257 3.6731415 -22.18042 2.279129c-7.5231934 -1.3939972 -13.941193 -4.8860626 -17.806213 -9.688431l0 0c-6.808319 0.565506 -13.391052 -1.9381409 -16.481201 -6.268387c-3.0901794 -4.330246 -2.0299683 -9.565308 2.6544495 -13.107056l0 0c-6.073517 -2.53714 -9.172607 -7.571686 -7.6812134 -12.478317c1.491394 -4.9066315 7.2353516 -8.573486 14.236572 -9.08844z" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m347.71796 228.58267c0 1.2978516 -1.052124 2.3499603 -2.3499756 2.3499603c-1.297821 0 -2.349945 -1.0521088 -2.349945 -2.3499603c0 -1.2978363 1.052124 -2.349945 2.349945 -2.349945c1.2978516 0 2.3499756 1.0521088 2.3499756 2.349945z" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m351.94028 225.65413c0 2.5956879 -2.1042175 4.6999207 -4.69989 4.6999207c-2.5957031 0 -4.6999207 -2.1042328 -4.6999207 -4.6999207c0 -2.5956879 2.1042175 -4.6999054 4.6999207 -4.6999054c2.5956726 0 4.69989 2.1042175 4.69989 4.6999054z" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m358.6943 218.76582c0 3.8935394 -3.1563416 7.0498657 -7.0498657 7.0498657c-3.8935242 0 -7.0498657 -3.1563263 -7.0498657 -7.0498657c0 -3.8935394 3.1563416 -7.0498657 7.0498657 -7.0498657c3.8935242 0 7.0498657 3.1563263 7.0498657 7.0498657z" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m315.61838 184.52805l0 0c-3.3113708 0.18397522 -6.6223755 -0.35913086 -9.488464 -1.5564117m17.860107 18.588898c-1.331543 0.3761902 -2.7273254 0.6266632 -4.151306 0.7449341m39.921875 7.4392548l0 0c-1.0014954 -1.0660095 -1.8399963 -2.2051392 -2.5012207 -3.3979645m48.75699 -5.0752716c-0.14724731 1.264389 -0.48202515 2.5141602 -0.99871826 3.7284546m20.857605 -26.765305l0 0c7.5073853 2.592987 12.245026 8.014023 12.17807 13.934677m16.547363 -28.776062c-1.2158203 2.0160675 -3.0718994 3.8045044 -5.422699 5.225067m-7.589813 -24.612915l0 0c0.20715332 0.81414795 0.30303955 1.6405334 0.28631592 2.4677124m-34.918304 -5.346176l0 0c0.7065735 -1.1384583 1.642334 -2.198471 2.7781372 -3.1470337m-28.761261 4.6465454l0 0c0.28826904 -0.9408264 0.74020386 -1.8525238 1.345459 -2.7141113m-31.83963 3.6362305l0 0c1.767273 0.7345886 3.4022217 1.6187592 4.8689575 2.6330566m-41.849762 18.061127l0 0c-0.3857727 -0.9061127 -0.6699219 -1.8324738 -0.84973145 -2.7703857" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m32.72441 46.721786l894.55115 0l0 60.125984l-894.55115 0z" fill-rule="nonzero"></path><path fill="#000000" d="m44.63066 91.56178l0 -26.484375l11.75 0q3.53125 0 5.375 0.71875q1.84375 0.703125 2.9375 2.515625q1.109375 1.8125 1.109375 3.984375q0 2.828125 -1.828125 4.765625q-1.8125 1.921875 -5.625 2.453125q1.390625 0.671875 2.109375 1.3125q1.53125 1.40625 2.90625 3.53125l4.609375 7.203125l-4.40625 0l-3.5 -5.515625q-1.546875 -2.375 -2.546875 -3.640625q-0.984375 -1.265625 -1.765625 -1.765625q-0.78125 -0.515625 -1.59375 -0.71875q-0.609375 -0.125 -1.953125 -0.125l-4.078125 0l0 11.765625l-3.5 0zm3.5 -14.796875l7.546875 0q2.390625 0 3.75 -0.5q1.359375 -0.5 2.0625 -1.578125q0.703125 -1.09375 0.703125 -2.390625q0 -1.875 -1.375 -3.078125q-1.359375 -1.21875 -4.296875 -1.21875l-8.390625 0l0 8.765625zm36.12906 8.625l3.359375 0.40625q-0.796875 2.953125 -2.953125 4.578125q-2.140625 1.625 -5.484375 1.625q-4.21875 0 -6.6875 -2.59375q-2.453125 -2.59375 -2.453125 -7.28125q0 -4.828125 2.484375 -7.5q2.5 -2.6875 6.46875 -2.6875q3.859375 0 6.296875 2.625q2.4375 2.625 2.4375 7.375q0 0.28125 -0.015625 0.859375l-14.3125 0q0.171875 3.171875 1.78125 4.859375q1.609375 1.671875 4.015625 1.671875q1.78125 0 3.046875 -0.9375q1.265625 -0.953125 2.015625 -3.0zm-10.6875 -5.265625l10.71875 0q-0.21875 -2.421875 -1.234375 -3.625q-1.546875 -1.890625 -4.015625 -1.890625q-2.25 0 -3.78125 1.5q-1.515625 1.5 -1.6875 4.015625zm30.822632 9.078125q-1.796875 1.53125 -3.46875 2.171875q-1.671875 0.625 -3.59375 0.625q-3.15625 0 -4.859375 -1.546875q-1.6875 -1.546875 -1.6875 -3.953125q0 -1.40625 0.640625 -2.5625q0.640625 -1.171875 1.671875 -1.875q1.046875 -0.703125 2.34375 -1.0625q0.953125 -0.265625 2.890625 -0.5q3.9375 -0.46875 5.796875 -1.109375q0.015625 -0.671875 0.015625 -0.859375q0 -1.984375 -0.921875 -2.796875q-1.25 -1.09375 -3.703125 -1.09375q-2.296875 0 -3.390625 0.796875q-1.09375 0.796875 -1.609375 2.84375l-3.1875 -0.4375q0.4375 -2.03125 1.421875 -3.28125q1.0 -1.265625 2.875 -1.9375q1.890625 -0.6875 4.359375 -0.6875q2.46875 0 4.0 0.578125q1.53125 0.578125 2.25 1.453125q0.734375 0.875 1.015625 2.21875q0.15625 0.828125 0.15625 3.0l0 4.328125q0 4.546875 0.203125 5.75q0.21875 1.1875 0.828125 2.296875l-3.390625 0q-0.5 -1.015625 -0.65625 -2.359375zm-0.265625 -7.265625q-1.765625 0.71875 -5.3125 1.21875q-2.0 0.296875 -2.84375 0.65625q-0.828125 0.359375 -1.28125 1.0625q-0.4375 0.6875 -0.4375 1.53125q0 1.3125 0.984375 2.1875q0.984375 0.859375 2.875 0.859375q1.875 0 3.34375 -0.828125q1.46875 -0.828125 2.15625 -2.25q0.515625 -1.09375 0.515625 -3.25l0 -1.1875zm20.963257 9.625l0 -2.421875q-1.828125 2.859375 -5.375 2.859375q-2.28125 0 -4.21875 -1.265625q-1.921875 -1.265625 -2.984375 -3.53125q-1.046875 -2.265625 -1.046875 -5.21875q0 -2.875 0.953125 -5.203125q0.96875 -2.34375 2.875 -3.59375q1.921875 -1.25 4.28125 -1.25q1.734375 0 3.09375 0.734375q1.359375 0.734375 2.203125 1.90625l0 -9.5l3.234375 0l0 26.484375l-3.015625 0zm-10.28125 -9.578125q0 3.6875 1.546875 5.515625q1.5625 1.828125 3.671875 1.828125q2.125 0 3.609375 -1.75q1.5 -1.75 1.5 -5.3125q0 -3.953125 -1.515625 -5.78125q-1.515625 -1.84375 -3.734375 -1.84375q-2.171875 0 -3.625 1.765625q-1.453125 1.765625 -1.453125 5.578125zm18.603882 -13.171875l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm8.277496 0l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm20.166382 1.59375l3.15625 0.46875q0.203125 1.453125 1.109375 2.125q1.203125 0.90625 3.296875 0.90625q2.265625 0 3.484375 -0.90625q1.234375 -0.90625 1.671875 -2.53125q0.25 -0.984375 0.234375 -4.171875q-2.125 2.515625 -5.3125 2.515625q-3.953125 0 -6.125 -2.84375q-2.171875 -2.859375 -2.171875 -6.859375q0 -2.75 1.0 -5.0625q1.0 -2.328125 2.875 -3.59375q1.890625 -1.265625 4.4375 -1.265625q3.40625 0 5.609375 2.75l0 -2.3125l3.0 0l0 16.578125q0 4.484375 -0.921875 6.359375q-0.90625 1.875 -2.890625 2.953125q-1.96875 1.078125 -4.859375 1.078125q-3.4375 0 -5.5625 -1.546875q-2.109375 -1.53125 -2.03125 -4.640625zm2.6875 -11.53125q0 3.78125 1.5 5.515625q1.5 1.734375 3.765625 1.734375q2.234375 0 3.75 -1.71875q1.515625 -1.734375 1.515625 -5.421875q0 -3.515625 -1.5625 -5.296875q-1.5625 -1.796875 -3.765625 -1.796875q-2.171875 0 -3.6875 1.765625q-1.515625 1.75 -1.515625 5.21875zm16.228882 10.390625l7.671875 -27.390625l2.609375 0l-7.65625 27.390625l-2.625 0zm16.355331 -0.453125l-5.875 -19.1875l3.359375 0l3.046875 11.078125l1.140625 4.109375q0.078125 -0.296875 1.0 -3.953125l3.046875 -11.234375l3.34375 0l2.875 11.125l0.953125 3.671875l1.109375 -3.703125l3.28125 -11.09375l3.171875 0l-6.0 19.1875l-3.375 0l-3.0625 -11.484375l-0.734375 -3.28125l-3.890625 14.765625l-3.390625 0zm23.379059 0l0 -19.1875l2.921875 0l0 2.90625q1.125 -2.03125 2.0625 -2.6875q0.953125 -0.65625 2.09375 -0.65625q1.640625 0 3.34375 1.046875l-1.125 3.015625q-1.1875 -0.703125 -2.375 -0.703125q-1.078125 0 -1.921875 0.640625q-0.84375 0.640625 -1.203125 1.78125q-0.546875 1.734375 -0.546875 3.796875l0 10.046875l-3.25 0zm12.477432 -22.75l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm15.386871 -2.90625l0.46875 2.875q-1.375 0.28125 -2.46875 0.28125q-1.765625 0 -2.75 -0.5625q-0.96875 -0.5625 -1.375 -1.46875q-0.390625 -0.90625 -0.390625 -3.84375l0 -11.03125l-2.375 0l0 -2.53125l2.375 0l0 -4.75l3.234375 -1.953125l0 6.703125l3.28125 0l0 2.53125l-3.28125 0l0 11.21875q0 1.390625 0.171875 1.796875q0.171875 0.390625 0.5625 0.625q0.390625 0.234375 1.109375 0.234375q0.546875 0 1.4375 -0.125zm3.2772064 -19.84375l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm8.277496 0l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm20.166382 1.59375l3.15625 0.46875q0.203125 1.453125 1.109375 2.125q1.203125 0.90625 3.296875 0.90625q2.2655945 0 3.4843445 -0.90625q1.234375 -0.90625 1.671875 -2.53125q0.25 -0.984375 0.234375 -4.171875q-2.125 2.515625 -5.3124695 2.515625q-3.953125 0 -6.125 -2.84375q-2.171875 -2.859375 -2.171875 -6.859375q0 -2.75 1.0 -5.0625q1.0 -2.328125 2.875 -3.59375q1.890625 -1.265625 4.4375 -1.265625q3.4062195 0 5.6093445 2.75l0 -2.3125l3.0 0l0 16.578125q0 4.484375 -0.921875 6.359375q-0.90625 1.875 -2.890625 2.953125q-1.96875 1.078125 -4.8593445 1.078125q-3.4375 0 -5.5625 -1.546875q-2.109375 -1.53125 -2.03125 -4.640625zm2.6875 -11.53125q0 3.78125 1.5 5.515625q1.5 1.734375 3.765625 1.734375q2.2343445 0 3.7499695 -1.71875q1.515625 -1.734375 1.515625 -5.421875q0 -3.515625 -1.5625 -5.296875q-1.5625 -1.796875 -3.7655945 -1.796875q-2.171875 0 -3.6875 1.765625q-1.515625 1.75 -1.515625 5.21875zm41.552948 7.578125q-1.796875 1.53125 -3.46875 2.171875q-1.671875 0.625 -3.59375 0.625q-3.15625 0 -4.859375 -1.546875q-1.6875 -1.546875 -1.6875 -3.953125q0 -1.40625 0.640625 -2.5625q0.640625 -1.171875 1.671875 -1.875q1.046875 -0.703125 2.34375 -1.0625q0.953125 -0.265625 2.890625 -0.5q3.9375 -0.46875 5.796875 -1.109375q0.015625 -0.671875 0.015625 -0.859375q0 -1.984375 -0.921875 -2.796875q-1.25 -1.09375 -3.703125 -1.09375q-2.296875 0 -3.390625 0.796875q-1.09375 0.796875 -1.609375 2.84375l-3.1875 -0.4375q0.4375 -2.03125 1.421875 -3.28125q1.0 -1.265625 2.875 -1.9375q1.890625 -0.6875 4.359375 -0.6875q2.46875 0 4.0 0.578125q1.53125 0.578125 2.25 1.453125q0.734375 0.875 1.015625 2.21875q0.15625 0.828125 0.15625 3.0l0 4.328125q0 4.546875 0.203125 5.75q0.21875 1.1875 0.828125 2.296875l-3.390625 0q-0.5 -1.015625 -0.65625 -2.359375zm-0.265625 -7.265625q-1.765625 0.71875 -5.3125 1.21875q-2.0 0.296875 -2.84375 0.65625q-0.828125 0.359375 -1.28125 1.0625q-0.4375 0.6875 -0.4375 1.53125q0 1.3125 0.984375 2.1875q0.984375 0.859375 2.875 0.859375q1.875 0 3.34375 -0.828125q1.46875 -0.828125 2.15625 -2.25q0.515625 -1.09375 0.515625 -3.25l0 -1.1875zm21.881104 9.625l-3.015625 0l0 -26.484375l3.25 0l0 9.453125q2.0625 -2.59375 5.265625 -2.59375q1.765625 0 3.34375 0.71875q1.578125 0.71875 2.59375 2.015625q1.03125 1.28125 1.609375 3.109375q0.578125 1.828125 0.578125 3.90625q0 4.921875 -2.4375 7.625q-2.4375 2.6875 -5.859375 2.6875q-3.390625 0 -5.328125 -2.84375l0 2.40625zm-0.03125 -9.734375q0 3.453125 0.9375 4.984375q1.53125 2.515625 4.15625 2.515625q2.125 0 3.671875 -1.84375q1.5625 -1.859375 1.5625 -5.53125q0 -3.765625 -1.5 -5.546875q-1.484375 -1.796875 -3.59375 -1.796875q-2.125 0 -3.6875 1.859375q-1.546875 1.84375 -1.546875 5.359375zm17.713257 9.734375l0 -26.484375l3.265625 0l0 26.484375l-3.265625 0zm7.1681213 -9.59375q0 -5.328125 2.953125 -7.890625q2.484375 -2.140625 6.03125 -2.140625q3.96875 0 6.46875 2.59375q2.515625 2.59375 2.515625 7.171875q0 3.703125 -1.109375 5.828125q-1.109375 2.109375 -3.234375 3.296875q-2.125 1.171875 -4.640625 1.171875q-4.015625 0 -6.5 -2.578125q-2.484375 -2.59375 -2.484375 -7.453125zm3.34375 0q0 3.6875 1.59375 5.53125q1.609375 1.828125 4.046875 1.828125q2.421875 0 4.03125 -1.84375q1.609375 -1.84375 1.609375 -5.625q0 -3.5625 -1.625 -5.390625q-1.609375 -1.828125 -4.015625 -1.828125q-2.4375 0 -4.046875 1.828125q-1.59375 1.8125 -1.59375 5.5zm31.135132 2.5625l3.203125 0.421875q-0.515625 3.296875 -2.6875 5.171875q-2.15625 1.875 -5.296875 1.875q-3.9375 0 -6.328125 -2.578125q-2.390625 -2.578125 -2.390625 -7.375q0 -3.109375 1.015625 -5.4375q1.03125 -2.34375 3.140625 -3.5q2.109375 -1.171875 4.578125 -1.171875q3.125 0 5.109375 1.59375q2.0 1.578125 2.546875 4.484375l-3.15625 0.484375q-0.453125 -1.9375 -1.609375 -2.90625q-1.140625 -0.984375 -2.765625 -0.984375q-2.453125 0 -4.0 1.765625q-1.53125 1.765625 -1.53125 5.578125q0 3.859375 1.484375 5.625q1.484375 1.75 3.875 1.75q1.90625 0 3.1875 -1.171875q1.28125 -1.1875 1.625 -3.625zm6.1640625 7.03125l0 -26.484375l3.25 0l0 15.109375l7.703125 -7.8125l4.203125 0l-7.328125 7.125l8.078125 12.0625l-4.015625 0l-6.34375 -9.8125l-2.296875 2.203125l0 7.609375l-3.25 0z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m440.2152 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m440.2152 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m453.62442 438.38455l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.860077 2.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.391327 -1.828125q0 -2.421875 0.5 -3.890625q0.5 -1.46875 1.46875 -2.265625q0.984375 -0.796875 2.46875 -0.796875q1.09375 0 1.921875 0.4375q0.828125 0.4375 1.359375 1.28125q0.546875 0.828125 0.84375 2.015625q0.3125 1.1875 0.3125 3.21875q0 2.390625 -0.5 3.859375q-0.484375 1.46875 -1.46875 2.28125q-0.96875 0.796875 -2.46875 0.796875q-1.96875 0 -3.078125 -1.40625q-1.359375 -1.703125 -1.359375 -5.53125zm1.71875 0q0 3.34375 0.78125 4.453125q0.796875 1.109375 1.9375 1.109375q1.15625 0 1.9375 -1.109375q0.78125 -1.125 0.78125 -4.453125q0 -3.359375 -0.78125 -4.46875q-0.78125 -1.109375 -1.953125 -1.109375q-1.15625 0 -1.828125 0.984375q-0.875 1.234375 -0.875 4.59375z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m529.6798 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m529.6798 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m543.089 438.38455l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.860046 2.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm14.688232 4.875l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m619.14435 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m619.14435 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m632.5535 438.38455l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.860107 2.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm17.172546 3.265625l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m708.60895 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m708.60895 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m722.0181 438.38455l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.860046 2.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.406982 1.28125l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m798.0735 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m798.0735 411.24408l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m811.48267 438.38455l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.860107 2.703125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm13.750671 4.875l0 -3.25l-5.90625 0l0 -1.53125l6.21875 -8.8125l1.359375 0l0 8.8125l1.84375 0l0 1.53125l-1.84375 0l0 3.25l-1.671875 0zm0 -4.78125l0 -6.140625l-4.25 6.140625l4.25 0z" fill-rule="nonzero"></path><path fill="#ead1dc" d="m260.48032 227.8727l75.1181 0l0 40.440964l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m260.48032 227.8727l75.1181 0l0 40.440964l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m283.95062 251.4038l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.859375 3.609375l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm4.191681 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm10.879211 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110077 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm14.031982 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125z" fill-rule="nonzero"></path><path fill="#d9ead3" d="m65.75328 411.2454l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m65.75328 411.2454l75.1181 0l0 40.44095l-75.1181 0z" fill-rule="nonzero"></path><path fill="#000000" d="m85.53747 438.38586l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm10.813217 4.921875l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm7.594467 5.234375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm12.870804 -1.453125q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.078842 8.71875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.875717 -6.8125l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m298.03937 268.31366l-194.74016 142.92911" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m298.03937 268.31366l-189.90314 139.379" fill-rule="evenodd"></path><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m107.15892 406.36108l-2.6811676 4.0167236l4.6357803 -1.3535767z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m298.03937 268.31366l179.74805 142.92911" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m298.03937 268.31366l175.05176 139.19482" fill-rule="evenodd"></path><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m472.0631 408.8013l4.5800476 1.5316162l-2.5240173 -4.117279z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m298.03937 268.31366l358.6772 142.92911" fill-rule="nonzero"></path><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m298.03937 268.31366l353.1034 140.70804" fill-rule="evenodd"></path><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m650.5313 410.5561l4.8271484 0.14550781l-3.604248 -3.2142944z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m106.43307 301.02625l111.37008 0l0 32.409454l-111.37008 0z" fill-rule="nonzero"></path><path fill="#000000" d="m122.51119 327.94626l-1.671875 0l0 -10.640625q-0.59375 0.578125 -1.578125 1.15625q-0.984375 0.5625 -1.765625 0.859375l0 -1.625q1.40625 -0.65625 2.453125 -1.59375q1.046875 -0.9375 1.484375 -1.8125l1.078125 0l0 13.65625zm5.016342 0l0 -1.90625l1.9062576 0l0 1.90625l-1.9062576 0zm16.28849 0l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm9.281967 -6.765625l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.4573212 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm16.4375 -0.671875l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.265625 -1.3125q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm12.016342 4.921875l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094467 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m445.85303 301.02625l111.370056 0l0 32.409454l-111.370056 0z" fill-rule="nonzero"></path><path fill="#000000" d="m455.6499 324.3525l1.671875 -0.21875q0.28125 1.421875 0.96875 2.046875q0.703125 0.625 1.6875 0.625q1.1875 0 2.0 -0.8125q0.8125 -0.828125 0.8125 -2.03125q0 -1.140625 -0.765625 -1.890625q-0.75 -0.75 -1.90625 -0.75q-0.46875 0 -1.171875 0.1875l0.1875 -1.46875q0.15625 0.015625 0.265625 0.015625q1.0625 0 1.90625 -0.546875q0.859375 -0.5625 0.859375 -1.71875q0 -0.921875 -0.625 -1.515625q-0.609375 -0.609375 -1.59375 -0.609375q-0.96875 0 -1.625 0.609375q-0.640625 0.609375 -0.828125 1.84375l-1.671875 -0.296875q0.296875 -1.6875 1.375 -2.609375q1.09375 -0.921875 2.71875 -0.921875q1.109375 0 2.046875 0.484375q0.9375 0.46875 1.421875 1.296875q0.5 0.828125 0.5 1.75q0 0.890625 -0.46875 1.609375q-0.46875 0.71875 -1.40625 1.15625q1.21875 0.265625 1.875 1.15625q0.671875 0.875 0.671875 2.1875q0 1.78125 -1.296875 3.015625q-1.296875 1.234375 -3.28125 1.234375q-1.796875 0 -2.984375 -1.0625q-1.171875 -1.0625 -1.34375 -2.765625zm11.297577 3.59375l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm9.600983 0.8125l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047607 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm12.766327 4.375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.2770691 1.734375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm6.4332886 3.546875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.313232 4.875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm7.5788574 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m308.41995 146.15486l146.77164 0l0 32.40944l-146.77164 0z" fill-rule="nonzero"></path><path fill="#000000" d="m326.98245 171.46548l0 1.609375l-8.984375 0q-0.015625 -0.609375 0.1875 -1.15625q0.34375 -0.921875 1.09375 -1.8125q0.765625 -0.890625 2.1875 -2.0625q2.21875 -1.8125 3.0 -2.875q0.78125 -1.0625 0.78125 -2.015625q0 -0.984375 -0.71875 -1.671875q-0.703125 -0.6875 -1.84375 -0.6875q-1.203125 0 -1.9375 0.734375q-0.71875 0.71875 -0.71875 2.0l-1.71875 -0.171875q0.171875 -1.921875 1.328125 -2.921875q1.15625 -1.015625 3.09375 -1.015625q1.953125 0 3.09375 1.09375q1.140625 1.078125 1.140625 2.6875q0 0.8125 -0.34375 1.609375q-0.328125 0.78125 -1.109375 1.65625q-0.765625 0.859375 -2.5625 2.390625q-1.5 1.265625 -1.9375 1.71875q-0.421875 0.4375 -0.703125 0.890625l6.671875 0zm2.531952 1.609375l0 -1.90625l1.90625 0l0 1.90625l-1.90625 0zm9.882233 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.978302 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.766327 0l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm16.016357 1.75l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.235077 5.875l0 -1.359375l6.265625 -7.1875q-1.0625 0.046875 -1.875 0.046875l-4.015625 0l0 -1.359375l8.046875 0l0 1.109375l-5.34375 6.25l-1.015625 1.140625q1.109375 -0.078125 2.09375 -0.078125l4.5625 0l0 1.4375l-8.71875 0zm12.9375 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm5.96875 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.735107 4.921875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.250702 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375z" fill-rule="nonzero"></path></g></svg>
+
diff --git a/doc/images/Keep_rendezvous_hashing.svg b/doc/images/Keep_rendezvous_hashing.svg
new file mode 100644 (file)
index 0000000..0c5c04b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 960.0 540.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="g150061aa58_0_20.0"><path d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#g150061aa58_0_20.0)"><path fill="#ffffff" d="m0 0l960.0 0l0 540.0l-960.0 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m32.72441 46.721786l894.55115 0l0 60.125984l-894.55115 0z" fill-rule="nonzero"></path><path fill="#000000" d="m44.63066 91.56178l0 -26.484375l11.75 0q3.53125 0 5.375 0.71875q1.84375 0.703125 2.9375 2.515625q1.109375 1.8125 1.109375 3.984375q0 2.828125 -1.828125 4.765625q-1.8125 1.921875 -5.625 2.453125q1.390625 0.671875 2.109375 1.3125q1.53125 1.40625 2.90625 3.53125l4.609375 7.203125l-4.40625 0l-3.5 -5.515625q-1.546875 -2.375 -2.546875 -3.640625q-0.984375 -1.265625 -1.765625 -1.765625q-0.78125 -0.515625 -1.59375 -0.71875q-0.609375 -0.125 -1.953125 -0.125l-4.078125 0l0 11.765625l-3.5 0zm3.5 -14.796875l7.546875 0q2.390625 0 3.75 -0.5q1.359375 -0.5 2.0625 -1.578125q0.703125 -1.09375 0.703125 -2.390625q0 -1.875 -1.375 -3.078125q-1.359375 -1.21875 -4.296875 -1.21875l-8.390625 0l0 8.765625zm36.12906 8.625l3.359375 0.40625q-0.796875 2.953125 -2.953125 4.578125q-2.140625 1.625 -5.484375 1.625q-4.21875 0 -6.6875 -2.59375q-2.453125 -2.59375 -2.453125 -7.28125q0 -4.828125 2.484375 -7.5q2.5 -2.6875 6.46875 -2.6875q3.859375 0 6.296875 2.625q2.4375 2.625 2.4375 7.375q0 0.28125 -0.015625 0.859375l-14.3125 0q0.171875 3.171875 1.78125 4.859375q1.609375 1.671875 4.015625 1.671875q1.78125 0 3.046875 -0.9375q1.265625 -0.953125 2.015625 -3.0zm-10.6875 -5.265625l10.71875 0q-0.21875 -2.421875 -1.234375 -3.625q-1.546875 -1.890625 -4.015625 -1.890625q-2.25 0 -3.78125 1.5q-1.515625 1.5 -1.6875 4.015625zm18.307007 11.4375l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm33.213257 0l0 -2.421875q-1.828125 2.859375 -5.375 2.859375q-2.28125 0 -4.21875 -1.265625q-1.921875 -1.265625 -2.984375 -3.53125q-1.046875 -2.265625 -1.046875 -5.21875q0 -2.875 0.953125 -5.203125q0.96875 -2.34375 2.875 -3.59375q1.921875 -1.25 4.28125 -1.25q1.734375 0 3.09375 0.734375q1.359375 0.734375 2.203125 1.90625l0 -9.5l3.234375 0l0 26.484375l-3.015625 0zm-10.28125 -9.578125q0 3.6875 1.546875 5.515625q1.5625 1.828125 3.671875 1.828125q2.125 0 3.609375 -1.75q1.5 -1.75 1.5 -5.3125q0 -3.953125 -1.515625 -5.78125q-1.515625 -1.84375 -3.734375 -1.84375q-2.171875 0 -3.625 1.765625q-1.453125 1.765625 -1.453125 5.578125zm31.728882 3.40625l3.359375 0.40625q-0.796875 2.953125 -2.953125 4.578125q-2.140625 1.625 -5.484375 1.625q-4.21875 0 -6.6875 -2.59375q-2.453125 -2.59375 -2.453125 -7.28125q0 -4.828125 2.484375 -7.5q2.5 -2.6875 6.46875 -2.6875q3.859375 0 6.296875 2.625q2.4375 2.625 2.4375 7.375q0 0.28125 -0.015625 0.859375l-14.3125 0q0.171875 3.171875 1.78125 4.859375q1.609375 1.671875 4.015625 1.671875q1.78125 0 3.046875 -0.9375q1.265625 -0.953125 2.015625 -3.0zm-10.6875 -5.265625l10.71875 0q-0.21875 -2.421875 -1.234375 -3.625q-1.546875 -1.890625 -4.015625 -1.890625q-2.25 0 -3.78125 1.5q-1.515625 1.5 -1.6875 4.015625zm16.588257 11.4375l0 -2.640625l12.21875 -14.015625q-2.078125 0.109375 -3.671875 0.109375l-7.8125 0l0 -2.640625l15.671875 0l0 2.15625l-10.390625 12.171875l-2.0 2.21875q2.1875 -0.15625 4.09375 -0.15625l8.875 0l0 2.796875l-16.984375 0zm25.710938 0l-7.296875 -19.1875l3.4375 0l4.109375 11.484375q0.671875 1.875 1.234375 3.875q0.4375 -1.515625 1.203125 -3.65625l4.265625 -11.703125l3.34375 0l-7.265625 19.1875l-3.03125 0zm12.1328125 -9.59375q0 -5.328125 2.953125 -7.890625q2.484375 -2.140625 6.03125 -2.140625q3.96875 0 6.46875 2.59375q2.515625 2.59375 2.515625 7.171875q0 3.703125 -1.109375 5.828125q-1.109375 2.109375 -3.234375 3.296875q-2.125 1.171875 -4.640625 1.171875q-4.015625 0 -6.5 -2.578125q-2.484375 -2.59375 -2.484375 -7.453125zm3.34375 0q0 3.6875 1.59375 5.53125q1.609375 1.828125 4.046875 1.828125q2.421875 0 4.03125 -1.84375q1.609375 -1.84375 1.609375 -5.625q0 -3.5625 -1.625 -5.390625q-1.609375 -1.828125 -4.015625 -1.828125q-2.4375 0 -4.046875 1.828125q-1.59375 1.8125 -1.59375 5.5zm31.197632 9.59375l0 -2.8125q-2.25 3.25 -6.09375 3.25q-1.6875 0 -3.171875 -0.65625q-1.46875 -0.65625 -2.1875 -1.640625q-0.703125 -0.984375 -1.0 -2.40625q-0.203125 -0.953125 -0.203125 -3.03125l0 -11.890625l3.265625 0l0 10.640625q0 2.546875 0.1875 3.4375q0.3125 1.28125 1.296875 2.015625q1.0 0.734375 2.46875 0.734375q1.453125 0 2.734375 -0.75q1.296875 -0.75 1.828125 -2.046875q0.53125 -1.296875 0.53125 -3.75l0 -10.28125l3.25 0l0 19.1875l-2.90625 0zm6.885132 -5.734375l3.21875 -0.5q0.265625 1.9375 1.5 2.96875q1.234375 1.03125 3.46875 1.03125q2.234375 0 3.3125 -0.90625q1.09375 -0.921875 1.09375 -2.15625q0 -1.09375 -0.96875 -1.734375q-0.65625 -0.4375 -3.3125 -1.09375q-3.578125 -0.90625 -4.96875 -1.5625q-1.375 -0.671875 -2.09375 -1.828125q-0.703125 -1.171875 -0.703125 -2.578125q0 -1.28125 0.578125 -2.375q0.59375 -1.09375 1.59375 -1.8125q0.765625 -0.5625 2.078125 -0.953125q1.3125 -0.390625 2.8125 -0.390625q2.25 0 3.953125 0.65625q1.71875 0.65625 2.53125 1.765625q0.8125 1.109375 1.109375 2.96875l-3.171875 0.4375q-0.21875 -1.484375 -1.265625 -2.3125q-1.03125 -0.84375 -2.921875 -0.84375q-2.25 0 -3.203125 0.75q-0.953125 0.734375 -0.953125 1.734375q0 0.625 0.390625 1.140625q0.40625 0.515625 1.25 0.859375q0.484375 0.1875 2.875 0.828125q3.453125 0.921875 4.8125 1.515625q1.359375 0.578125 2.140625 1.703125q0.78125 1.125 0.78125 2.78125q0 1.625 -0.953125 3.0625q-0.953125 1.4375 -2.75 2.234375q-1.78125 0.78125 -4.03125 0.78125q-3.75 0 -5.703125 -1.546875q-1.953125 -1.5625 -2.5 -4.625zm30.331894 5.734375l0 -26.484375l3.25 0l0 9.5q2.28125 -2.640625 5.75 -2.640625q2.125 0 3.703125 0.84375q1.578125 0.84375 2.25 2.328125q0.671875 1.46875 0.671875 4.296875l0 12.15625l-3.25 0l0 -12.15625q0 -2.4375 -1.0625 -3.546875q-1.046875 -1.109375 -2.984375 -1.109375q-1.4375 0 -2.71875 0.75q-1.265625 0.734375 -1.8125 2.03125q-0.546875 1.28125 -0.546875 3.53125l0 10.5l-3.25 0zm33.275726 -2.359375q-1.796875 1.53125 -3.46875 2.171875q-1.671875 0.625 -3.5937195 0.625q-3.15625 0 -4.859375 -1.546875q-1.6875 -1.546875 -1.6875 -3.953125q0 -1.40625 0.640625 -2.5625q0.640625 -1.171875 1.671875 -1.875q1.046875 -0.703125 2.34375 -1.0625q0.953125 -0.265625 2.8905945 -0.5q3.9375 -0.46875 5.796875 -1.109375q0.015625 -0.671875 0.015625 -0.859375q0 -1.984375 -0.921875 -2.796875q-1.25 -1.09375 -3.703125 -1.09375q-2.2968445 0 -3.3905945 0.796875q-1.09375 0.796875 -1.609375 2.84375l-3.1875 -0.4375q0.4375 -2.03125 1.421875 -3.28125q1.0 -1.265625 2.875 -1.9375q1.890625 -0.6875 4.3593445 -0.6875q2.46875 0 4.0 0.578125q1.53125 0.578125 2.25 1.453125q0.734375 0.875 1.015625 2.21875q0.15625 0.828125 0.15625 3.0l0 4.328125q0 4.546875 0.203125 5.75q0.21875 1.1875 0.828125 2.296875l-3.390625 0q-0.5 -1.015625 -0.65625 -2.359375zm-0.265625 -7.265625q-1.765625 0.71875 -5.3125 1.21875q-1.9999695 0.296875 -2.8437195 0.65625q-0.828125 0.359375 -1.28125 1.0625q-0.4375 0.6875 -0.4375 1.53125q0 1.3125 0.984375 2.1875q0.984375 0.859375 2.8749695 0.859375q1.875 0 3.34375 -0.828125q1.46875 -0.828125 2.15625 -2.25q0.515625 -1.09375 0.515625 -3.25l0 -1.1875zm7.213257 3.890625l3.21875 -0.5q0.265625 1.9375 1.5 2.96875q1.234375 1.03125 3.46875 1.03125q2.234375 0 3.3125 -0.90625q1.09375 -0.921875 1.09375 -2.15625q0 -1.09375 -0.96875 -1.734375q-0.65625 -0.4375 -3.3125 -1.09375q-3.578125 -0.90625 -4.96875 -1.5625q-1.375 -0.671875 -2.09375 -1.828125q-0.703125 -1.171875 -0.703125 -2.578125q0 -1.28125 0.578125 -2.375q0.59375 -1.09375 1.59375 -1.8125q0.765625 -0.5625 2.078125 -0.953125q1.3125 -0.390625 2.8125 -0.390625q2.25 0 3.953125 0.65625q1.71875 0.65625 2.53125 1.765625q0.8125 1.109375 1.109375 2.96875l-3.171875 0.4375q-0.21875 -1.484375 -1.265625 -2.3125q-1.03125 -0.84375 -2.921875 -0.84375q-2.25 0 -3.203125 0.75q-0.953125 0.734375 -0.953125 1.734375q0 0.625 0.390625 1.140625q0.40625 0.515625 1.25 0.859375q0.484375 0.1875 2.875 0.828125q3.453125 0.921875 4.8125 1.515625q1.359375 0.578125 2.140625 1.703125q0.78125 1.125 0.78125 2.78125q0 1.625 -0.953125 3.0625q-0.953125 1.4375 -2.75 2.234375q-1.78125 0.78125 -4.03125 0.78125q-3.75 0 -5.703125 -1.546875q-1.953125 -1.5625 -2.5 -4.625zm19.960938 5.734375l0 -26.484375l3.25 0l0 9.5q2.28125 -2.640625 5.75 -2.640625q2.125 0 3.703125 0.84375q1.578125 0.84375 2.25 2.328125q0.671875 1.46875 0.671875 4.296875l0 12.15625l-3.25 0l0 -12.15625q0 -2.4375 -1.0625 -3.546875q-1.046875 -1.109375 -2.984375 -1.109375q-1.4375 0 -2.71875 0.75q-1.265625 0.734375 -1.8125 2.03125q-0.546875 1.28125 -0.546875 3.53125l0 10.5l-3.25 0zm20.775757 -22.75l0 -3.734375l3.25 0l0 3.734375l-3.25 0zm0 22.75l0 -19.1875l3.25 0l0 19.1875l-3.25 0zm8.277496 0l0 -19.1875l2.921875 0l0 2.734375q2.125 -3.171875 6.109375 -3.171875q1.734375 0 3.1875 0.625q1.453125 0.625 2.171875 1.640625q0.734375 1.015625 1.015625 2.40625q0.1875 0.890625 0.1875 3.15625l0 11.796875l-3.25 0l0 -11.671875q0 -1.984375 -0.390625 -2.96875q-0.375 -0.984375 -1.34375 -1.5625q-0.953125 -0.59375 -2.265625 -0.59375q-2.078125 0 -3.59375 1.3125q-1.5 1.3125 -1.5 5.0l0 10.484375l-3.25 0zm20.166382 1.59375l3.15625 0.46875q0.203125 1.453125 1.109375 2.125q1.203125 0.90625 3.296875 0.90625q2.265625 0 3.484375 -0.90625q1.234375 -0.90625 1.671875 -2.53125q0.25 -0.984375 0.234375 -4.171875q-2.125 2.515625 -5.3125 2.515625q-3.953125 0 -6.125 -2.84375q-2.171875 -2.859375 -2.171875 -6.859375q0 -2.75 1.0 -5.0625q1.0 -2.328125 2.875 -3.59375q1.890625 -1.265625 4.4375 -1.265625q3.40625 0 5.609375 2.75l0 -2.3125l3.0 0l0 16.578125q0 4.484375 -0.921875 6.359375q-0.90625 1.875 -2.890625 2.953125q-1.96875 1.078125 -4.859375 1.078125q-3.4375 0 -5.5625 -1.546875q-2.109375 -1.53125 -2.03125 -4.640625zm2.6875 -11.53125q0 3.78125 1.5 5.515625q1.5 1.734375 3.765625 1.734375q2.234375 0 3.75 -1.71875q1.515625 -1.734375 1.515625 -5.421875q0 -3.515625 -1.5625 -5.296875q-1.5625 -1.796875 -3.765625 -1.796875q-2.171875 0 -3.6875 1.765625q-1.515625 1.75 -1.515625 5.21875z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m32.72441 467.15222l894.55115 0l0 54.519714l-894.55115 0z" fill-rule="nonzero"></path><path fill="#595959" d="m167.41017 499.19223l-3.796875 -12.453125l2.171875 0l1.984375 7.1875l0.734375 2.671875q0.046875 -0.203125 0.640625 -2.5625l1.984375 -7.296875l2.171875 0l1.859375 7.21875l0.625 2.390625l0.71875 -2.40625l2.125 -7.203125l2.046875 0l-3.890625 12.453125l-2.1875 0l-1.984375 -7.453125l-0.46875 -2.125l-2.53125 9.578125l-2.203125 0zm23.566406 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm11.769531 -7.328125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm4.9414062 1.03125l2.046875 0.3125q0.125 0.9375 0.71875 1.375q0.78125 0.59375 2.140625 0.59375q1.46875 0 2.265625 -0.59375q0.796875 -0.578125 1.078125 -1.640625q0.15625 -0.640625 0.140625 -2.703125q-1.375 1.625 -3.4375 1.625q-2.5625 0 -3.96875 -1.84375q-1.40625 -1.859375 -1.40625 -4.453125q0 -1.78125 0.640625 -3.28125q0.640625 -1.515625 1.859375 -2.328125q1.234375 -0.828125 2.890625 -0.828125q2.203125 0 3.625 1.78125l0 -1.5l1.953125 0l0 10.765625q0 2.90625 -0.59375 4.109375q-0.59375 1.21875 -1.875 1.921875q-1.28125 0.703125 -3.15625 0.703125q-2.234375 0 -3.609375 -1.0q-1.359375 -1.0 -1.3125 -3.015625zm1.734375 -7.484375q0 2.453125 0.96875 3.578125q0.984375 1.125 2.453125 1.125q1.453125 0 2.4375 -1.109375q0.984375 -1.125 0.984375 -3.515625q0 -2.28125 -1.015625 -3.4375q-1.015625 -1.171875 -2.453125 -1.171875q-1.40625 0 -2.390625 1.140625q-0.984375 1.140625 -0.984375 3.390625zm11.988281 6.453125l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm17.957031 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm19.835938 -8.21875l-11.34375 0l0 -1.96875l11.34375 0l0 1.96875zm0 5.21875l-11.34375 0l0 -1.96875l11.34375 0l0 1.96875zm9.5742035 4.890625l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm12.566406 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm14.253906 6.21875l-3.796875 -12.453125l2.171875 0l1.984375 7.1875l0.734375 2.671875q0.046875 -0.203125 0.640625 -2.5625l1.984375 -7.296875l2.171875 0l1.859375 7.21875l0.625 2.390625l0.71875 -2.40625l2.125 -7.203125l2.046875 0l-3.890625 12.453125l-2.1875 0l-1.984375 -7.453125l-0.46875 -2.125l-2.53125 9.578125l-2.203125 0zm29.828125 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3945312 11.015625l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.425781 10.921875l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.410156 6.15625l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.2265625 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 10.984375l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.410156 6.15625l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm8.0234375 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm13.441406 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm10.003906 4.359375l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm18.4375 -7.328125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm4.4726562 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm18.667969 0l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm21.375 -0.296875l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm11.738281 7.421875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm11.4765625 0l-4.734375 -12.453125l2.21875 0l2.671875 7.453125q0.4375 1.21875 0.796875 2.515625q0.28125 -0.984375 0.78125 -2.375l2.765625 -7.59375l2.171875 0l-4.703125 12.453125l-1.96875 0zm17.0625 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm11.738281 7.421875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.332031 -14.296875l0 2.453125l-2.265625 0l0 -1.9375q0 -1.578125 0.375 -2.28125q0.5 -0.9375 1.5625 -1.40625l0.515625 0.8125q-0.640625 0.265625 -0.953125 0.8125q-0.296875 0.53125 -0.328125 1.546875l1.09375 0zm3.640625 0l0 2.453125l-2.265625 0l0 -1.9375q0 -1.578125 0.375 -2.28125q0.484375 -0.9375 1.5625 -1.40625l0.515625 0.8125q-0.65625 0.265625 -0.96875 0.8125q-0.296875 0.53125 -0.328125 1.546875l1.109375 0zm2.1953735 8.78125l2.140625 -0.1875q0.15625 1.28125 0.703125 2.109375q0.5625 0.828125 1.734375 1.34375q1.171875 0.5 2.640625 0.5q1.296875 0 2.296875 -0.375q1.0 -0.390625 1.484375 -1.0625q0.484375 -0.6875 0.484375 -1.484375q0 -0.796875 -0.46875 -1.40625q-0.46875 -0.609375 -1.546875 -1.015625q-0.6875 -0.265625 -3.0625 -0.828125q-2.359375 -0.578125 -3.3125 -1.078125q-1.234375 -0.640625 -1.84375 -1.59375q-0.59375 -0.96875 -0.59375 -2.140625q0 -1.3125 0.734375 -2.4375q0.75 -1.125 2.15625 -1.703125q1.421875 -0.59375 3.15625 -0.59375q1.90625 0 3.359375 0.609375q1.46875 0.609375 2.25 1.8125q0.796875 1.1875 0.84375 2.703125l-2.171875 0.171875q-0.171875 -1.640625 -1.1875 -2.46875q-1.015625 -0.828125 -3.0 -0.828125q-2.0625 0 -3.015625 0.765625q-0.9375 0.75 -0.9375 1.8125q0 0.921875 0.671875 1.515625q0.65625 0.609375 3.421875 1.234375q2.78125 0.625 3.8125 1.09375q1.5 0.6875 2.203125 1.75q0.71875 1.0625 0.71875 2.4375q0 1.375 -0.78125 2.59375q-0.78125 1.203125 -2.25 1.890625q-1.46875 0.671875 -3.3125 0.671875q-2.328125 0 -3.90625 -0.671875q-1.578125 -0.6875 -2.484375 -2.046875q-0.890625 -1.375 -0.9375 -3.09375zm15.9453125 -9.390625l0 -2.453125l2.265625 0l0 1.9375q0 1.5625 -0.359375 2.265625q-0.5 0.9375 -1.578125 1.421875l-0.515625 -0.828125q0.640625 -0.265625 0.953125 -0.8125q0.3125 -0.5625 0.34375 -1.53125l-1.109375 0zm3.640625 0l0 -2.453125l2.265625 0l0 1.9375q0 1.5625 -0.375 2.265625q-0.5 0.9375 -1.5625 1.421875l-0.515625 -0.828125q0.625 -0.265625 0.9375 -0.8125q0.3125 -0.5625 0.34375 -1.53125l-1.09375 0zm12.097656 14.90625l0 -10.8125l-1.875 0l0 -1.640625l1.875 0l0 -1.3125q0 -1.265625 0.21875 -1.875q0.296875 -0.8125 1.0625 -1.3125q0.78125 -0.515625 2.15625 -0.515625q0.890625 0 1.96875 0.203125l-0.3125 1.84375q-0.65625 -0.125 -1.25 -0.125q-0.953125 0 -1.359375 0.421875q-0.390625 0.40625 -0.390625 1.53125l0 1.140625l2.421875 0l0 1.640625l-2.421875 0l0 10.8125l-2.09375 0zm5.3710938 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.941406 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm13.832031 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm17.453125 1.828125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.2773438 -4.328125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.941406 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm8.0234375 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.972656 1.03125l2.046875 0.3125q0.125 0.9375 0.71875 1.375q0.78125 0.59375 2.140625 0.59375q1.46875 0 2.265625 -0.59375q0.796875 -0.578125 1.078125 -1.640625q0.15625 -0.640625 0.140625 -2.703125q-1.375 1.625 -3.4375 1.625q-2.5625 0 -3.96875 -1.84375q-1.40625 -1.859375 -1.40625 -4.453125q0 -1.78125 0.640625 -3.28125q0.640625 -1.515625 1.859375 -2.328125q1.234375 -0.828125 2.890625 -0.828125q2.203125 0 3.625 1.78125l0 -1.5l1.953125 0l0 10.765625q0 2.90625 -0.59375 4.109375q-0.59375 1.21875 -1.875 1.921875q-1.28125 0.703125 -3.15625 0.703125q-2.234375 0 -3.609375 -1.0q-1.359375 -1.0 -1.3125 -3.015625zm1.734375 -7.484375q0 2.453125 0.96875 3.578125q0.984375 1.125 2.453125 1.125q1.453125 0 2.4375 -1.109375q0.984375 -1.125 0.984375 -3.515625q0 -2.28125 -1.015625 -3.4375q-1.015625 -1.171875 -2.453125 -1.171875q-1.40625 0 -2.390625 1.140625q-0.984375 1.140625 -0.984375 3.390625zm20.609375 6.453125l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.378906 6.3125l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm4.5976562 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm20.082031 1.65625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.890625 4.5625l0 -17.1875l2.109375 0l0 9.796875l5.0 -5.0625l2.71875 0l-4.75 4.625l5.234375 7.828125l-2.59375 0l-4.125 -6.359375l-1.484375 1.421875l0 4.9375l-2.109375 0zm20.308594 -14.296875l0 2.453125l-2.265625 0l0 -1.9375q0 -1.578125 0.375 -2.28125q0.5 -0.9375 1.5625 -1.40625l0.515625 0.8125q-0.640625 0.265625 -0.953125 0.8125q-0.296875 0.53125 -0.328125 1.546875l1.09375 0zm3.640625 0l0 2.453125l-2.265625 0l0 -1.9375q0 -1.578125 0.375 -2.28125q0.484375 -0.9375 1.5625 -1.40625l0.515625 0.8125q-0.65625 0.265625 -0.96875 0.8125q-0.296875 0.53125 -0.328125 1.546875l1.109375 0zm2.8828125 14.296875l0 -17.1875l6.4375 0q1.96875 0 3.15625 0.53125q1.1875 0.515625 1.859375 1.609375q0.6875 1.078125 0.6875 2.265625q0 1.09375 -0.609375 2.078125q-0.59375 0.96875 -1.796875 1.5625q1.5625 0.453125 2.390625 1.5625q0.84375 1.09375 0.84375 2.59375q0 1.203125 -0.515625 2.25q-0.5 1.03125 -1.25 1.59375q-0.75 0.5625 -1.890625 0.859375q-1.125 0.28125 -2.765625 0.28125l-6.546875 0zm2.265625 -9.96875l3.71875 0q1.515625 0 2.171875 -0.1875q0.859375 -0.265625 1.296875 -0.859375q0.4375 -0.59375 0.4375 -1.5q0 -0.859375 -0.40625 -1.5q-0.40625 -0.65625 -1.171875 -0.890625q-0.765625 -0.25 -2.609375 -0.25l-3.4375 0l0 5.1875zm0 7.9375l4.28125 0q1.09375 0 1.546875 -0.078125q0.78125 -0.140625 1.3125 -0.46875q0.53125 -0.328125 0.859375 -0.953125q0.34375 -0.625 0.34375 -1.453125q0 -0.953125 -0.5 -1.65625q-0.484375 -0.71875 -1.359375 -1.0q-0.875 -0.296875 -2.515625 -0.296875l-3.96875 0l0 5.90625zm12.9921875 -12.875l0 -2.453125l2.265625 0l0 1.9375q0 1.5625 -0.359375 2.265625q-0.5 0.9375 -1.578125 1.421875l-0.515625 -0.828125q0.640625 -0.265625 0.953125 -0.8125q0.3125 -0.5625 0.34375 -1.53125l-1.109375 0zm3.640625 0l0 -2.453125l2.265625 0l0 1.9375q0 1.5625 -0.375 2.265625q-0.5 0.9375 -1.5625 1.421875l-0.515625 -0.828125q0.625 -0.265625 0.9375 -0.8125q0.3125 -0.5625 0.34375 -1.53125l-1.09375 0zm8.8671875 10.671875q-0.015625 -0.421875 -0.015625 -0.625q0 -1.25 0.359375 -2.15625q0.25 -0.671875 0.828125 -1.359375q0.421875 -0.515625 1.515625 -1.46875q1.09375 -0.96875 1.421875 -1.546875q0.328125 -0.578125 0.328125 -1.25q0 -1.234375 -0.96875 -2.15625q-0.953125 -0.9375 -2.34375 -0.9375q-1.34375 0 -2.25 0.84375q-0.90625 0.84375 -1.1875 2.625l-2.15625 -0.25q0.28125 -2.40625 1.734375 -3.671875q1.453125 -1.28125 3.828125 -1.28125q2.515625 0 4.015625 1.375q1.5 1.359375 1.5 3.3125q0 1.125 -0.53125 2.078125q-0.515625 0.9375 -2.0625 2.296875q-1.03125 0.921875 -1.34375 1.359375q-0.3125 0.421875 -0.46875 0.984375q-0.15625 0.5625 -0.171875 1.828125l-2.03125 0zm-0.125 4.234375l0 -2.40625l2.40625 0l0 2.40625l-2.40625 0z" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.666668 199.10498l0 245.38583" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m340.52756 199.10498l0 245.38583" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m636.3884 199.10498l0 245.38583" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m932.2493 199.10498l0 245.38583" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 199.60367l888.5801 0" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 240.80052l888.5801 0" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 280.80054l888.5801 0" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 320.80054l888.5801 0" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 360.80054l888.5801 0" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 402.39633l888.5801 0" fill-rule="nonzero"></path><path stroke="#9e9e9e" stroke-width="1.0" stroke-linecap="butt" d="m44.16798 443.99213l888.5801 0" fill-rule="nonzero"></path><path fill="#000000" d="m55.432293 226.52367l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0zm4.886429 0l0 -13.59375l4.687496 0q1.578125 0 2.421875 0.1875q1.15625 0.265625 1.984375 0.96875q1.078125 0.921875 1.609375 2.34375q0.53125 1.40625 0.53125 3.21875q0 1.546875 -0.359375 2.75q-0.359375 1.1875 -0.921875 1.984375q-0.5625 0.78125 -1.234375 1.234375q-0.671875 0.4375 -1.625 0.671875q-0.953125 0.234375 -2.1875 0.234375l-4.906246 0zm1.796875 -1.609375l2.9062462 0q1.34375 0 2.109375 -0.25q0.765625 -0.25 1.21875 -0.703125q0.640625 -0.640625 1.0 -1.71875q0.359375 -1.078125 0.359375 -2.625q0 -2.125 -0.703125 -3.265625q-0.703125 -1.15625 -1.703125 -1.546875q-0.71875 -0.28125 -2.328125 -0.28125l-2.8593712 0l0 10.390625zm14.644817 5.609375q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm2.634552 -8.375l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm13.927948 8.375l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m350.9338 226.52367l0 -13.59375l2.71875 0l3.21875 9.625q0.4375 1.34375 0.640625 2.015625q0.234375 -0.75 0.734375 -2.1875l3.25 -9.453125l2.421875 0l0 13.59375l-1.734375 0l0 -11.390625l-3.953125 11.390625l-1.625 0l-3.9375 -11.578125l0 11.578125l-1.734375 0zm15.603302 0l0 -13.59375l4.6875 0q1.578125 0 2.421875 0.1875q1.15625 0.265625 1.984375 0.96875q1.078125 0.921875 1.609375 2.34375q0.53125 1.40625 0.53125 3.21875q0 1.546875 -0.359375 2.75q-0.359375 1.1875 -0.921875 1.984375q-0.5625 0.78125 -1.234375 1.234375q-0.671875 0.4375 -1.625 0.671875q-0.953125 0.234375 -2.1875 0.234375l-4.90625 0zm1.796875 -1.609375l2.90625 0q1.34375 0 2.109375 -0.25q0.765625 -0.25 1.21875 -0.703125q0.640625 -0.640625 1.0 -1.71875q0.359375 -1.078125 0.359375 -2.625q0 -2.125 -0.703125 -3.265625q-0.703125 -1.15625 -1.703125 -1.546875q-0.71875 -0.28125 -2.328125 -0.28125l-2.859375 0l0 10.390625zm10.988586 -1.953125l1.765625 -0.15625q0.1875 1.28125 0.890625 1.9375q0.71875 0.640625 1.71875 0.640625q1.203125 0 2.03125 -0.90625q0.84375 -0.90625 0.84375 -2.421875q0 -1.421875 -0.8125 -2.25q-0.796875 -0.828125 -2.09375 -0.828125q-0.796875 0 -1.453125 0.375q-0.640625 0.359375 -1.015625 0.953125l-1.578125 -0.203125l1.328125 -7.0l6.765625 0l0 1.609375l-5.4375 0l-0.734375 3.640625q1.234375 -0.84375 2.578125 -0.84375q1.78125 0 3.0 1.234375q1.234375 1.234375 1.234375 3.171875q0 1.84375 -1.078125 3.1875q-1.3125 1.65625 -3.578125 1.65625q-1.859375 0 -3.03125 -1.03125q-1.171875 -1.046875 -1.34375 -2.765625zm14.031952 7.5625q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm3.165802 -4.0l0 -13.59375l5.109375 0q1.546875 0 2.484375 0.40625q0.953125 0.40625 1.484375 1.265625q0.53125 0.859375 0.53125 1.796875q0 0.875 -0.46875 1.65625q-0.46875 0.765625 -1.4375 1.234375q1.234375 0.359375 1.890625 1.234375q0.671875 0.875 0.671875 2.0625q0 0.953125 -0.40625 1.78125q-0.390625 0.8125 -0.984375 1.265625q-0.59375 0.4375 -1.5 0.671875q-0.890625 0.21875 -2.1875 0.21875l-5.1875 0zm1.796875 -7.890625l2.9375 0q1.203125 0 1.71875 -0.15625q0.6875 -0.203125 1.03125 -0.671875q0.359375 -0.46875 0.359375 -1.1875q0 -0.671875 -0.328125 -1.1875q-0.328125 -0.515625 -0.9375 -0.703125q-0.59375 -0.203125 -2.0625 -0.203125l-2.71875 0l0 4.109375zm0 6.28125l3.390625 0q0.875 0 1.21875 -0.0625q0.625 -0.109375 1.046875 -0.359375q0.421875 -0.265625 0.6875 -0.765625q0.265625 -0.5 0.265625 -1.140625q0 -0.765625 -0.390625 -1.328125q-0.390625 -0.5625 -1.078125 -0.78125q-0.6875 -0.234375 -1.984375 -0.234375l-3.15625 0l0 4.671875zm11.599823 5.609375l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m648.46655 226.52367l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm18.394836 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.125732 -5.8125l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.8323364 0.8125l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.297546 5.109375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm14.031982 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m61.447918 263.88052l-1.75 0l-3.421875 -3.9375l0 3.9375l-1.28125 0l0 -10.34375l1.28125 0l0 6.359375l3.296875 -3.375l1.6875 0l-3.453125 3.390625l3.640625 3.96875zm7.667446 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171871 0q0 1.125 0.6249962 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6874962 -0.25 -1.1249962 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0624962 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.14062119 0.40625 -0.18749619 0.890625l3.8749962 0zm9.3862 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.4487 0.4375q0 0.984375 -0.28125 1.71875q-0.265625 0.734375 -0.75 1.21875q-0.484375 0.484375 -1.140625 0.734375q-0.65625 0.234375 -1.421875 0.234375q-0.359375 0 -0.703125 -0.046875q-0.34375 -0.03125 -0.703125 -0.125l0 3.078125l-1.28125 0l0 -10.359375l1.140625 0l0.078125 1.234375q0.546875 -0.75 1.171875 -1.046875q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.34375 0.15625 0.734375 0.25q0.390625 0.078125 0.765625 0.078125q1.03125 0 1.609375 -0.703125q0.59375 -0.703125 0.59375 -2.109375zm9.5112 -1.03125q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625z" fill-rule="nonzero"></path><path fill="#000000" d="m355.41818 263.88052l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.1987 3.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.620575 -3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm2.6987 0.234375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.245575 3.609375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151825 -2.40625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm2.85495 -1.203125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.401825 -0.203125q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.7612 1.640625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.026825 8.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058075 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 0.265625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.370575 -9.15625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.4487 4.953125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.1987 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm7.808075 2.796875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 -3.796875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm2.79245 0.734375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339325 -0.453125q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.6987 -4.90625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.558105 4.328125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.6250305 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.31253052 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.776855 0.953125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.839294 -0.8125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm14.94873 7.09375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058044 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058105 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm9.026855 8.34375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm10.167419 1.234375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9331055 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375z" fill-rule="nonzero"></path><path fill="#000000" d="m652.6853 263.88052l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151855 -2.40625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.558044 -0.71875q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.214355 -2.375q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm10.964294 8.390625q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.870605 -8.890625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.386169 -1.03125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.058105 3.0625q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.683044 3.875q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.97998 2.71875l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.526794 5.9375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.44873 -0.09375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.386169 -6.078125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.058105 3.0625q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.276794 5.75q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125zm8.183105 -2.421875q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.573669 5.625q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.276855 0.546875q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.386169 -3.015625q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.401855 3.328125q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.401794 0.265625l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.120605 5.984375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.761169 -6.84375q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.19873 4.296875q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm6.8080444 3.0625l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.44873 0.28125q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.308044 -1.0q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm8.88623 3.984375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.745605 3.5625q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.979919 2.71875l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.433105 8.34375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875z" fill-rule="nonzero"></path><path fill="#000000" d="m61.447918 303.88052l-1.75 0l-3.421875 -3.9375l0 3.9375l-1.28125 0l0 -10.34375l1.28125 0l0 6.359375l3.296875 -3.375l1.6875 0l-3.453125 3.390625l3.640625 3.96875zm7.667446 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171871 0q0 1.125 0.6249962 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6874962 -0.25 -1.1249962 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0624962 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.14062119 0.40625 -0.18749619 0.890625l3.8749962 0zm9.3862 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.4487 0.4375q0 0.984375 -0.28125 1.71875q-0.265625 0.734375 -0.75 1.21875q-0.484375 0.484375 -1.140625 0.734375q-0.65625 0.234375 -1.421875 0.234375q-0.359375 0 -0.703125 -0.046875q-0.34375 -0.03125 -0.703125 -0.125l0 3.078125l-1.28125 0l0 -10.359375l1.140625 0l0.078125 1.234375q0.546875 -0.75 1.171875 -1.046875q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.34375 0.15625 0.734375 0.25q0.390625 0.078125 0.765625 0.078125q1.03125 0 1.609375 -0.703125q0.59375 -0.703125 0.59375 -2.109375zm9.1987 3.75l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875z" fill-rule="nonzero"></path><path fill="#000000" d="m355.41818 303.88052l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.1987 3.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.620575 -3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm2.6987 0.234375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.245575 3.609375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151825 -2.40625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm2.85495 -1.203125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.401825 -0.203125q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.7612 1.640625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.026825 8.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058075 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 0.265625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.370575 -9.15625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.4487 4.953125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.1987 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm7.808075 2.796875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 -3.796875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm2.79245 0.734375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339325 -0.453125q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.6987 -4.90625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.558105 4.328125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.6250305 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.31253052 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.776855 0.953125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.839294 -0.8125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm14.94873 7.09375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058044 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058105 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm9.026855 8.34375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm10.167419 1.234375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9331055 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375z" fill-rule="nonzero"></path><path fill="#000000" d="m652.77905 303.88052l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm1.4643555 -3.515625q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.44873 -1.75q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.323669 -4.140625l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm6.6206055 8.390625l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.698669 0.9375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.91748 0.203125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.526794 4.28125q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.85498 2.140625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.636169 5.3125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm2.6831055 -0.5625q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.44873 -1.75q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.136169 1.1875q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.245605 -5.328125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.433044 -0.765625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.558105 4.328125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm2.6830444 -0.5625q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm11.839355 3.609375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm8.198669 3.34375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.19873 3.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.026855 8.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm7.0580444 0.265625l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.63623 -5.046875l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.058044 3.0625q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.464355 4.59375q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm8.886169 3.984375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.495605 -8.125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.339294 3.609375q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.82373 -4.328125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0z" fill-rule="nonzero"></path><path fill="#000000" d="m61.447918 343.88052l-1.75 0l-3.421875 -3.9375l0 3.9375l-1.28125 0l0 -10.34375l1.28125 0l0 6.359375l3.296875 -3.375l1.6875 0l-3.453125 3.390625l3.640625 3.96875zm7.667446 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171871 0q0 1.125 0.6249962 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6874962 -0.25 -1.1249962 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0624962 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.14062119 0.40625 -0.18749619 0.890625l3.8749962 0zm9.3862 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.4487 0.4375q0 0.984375 -0.28125 1.71875q-0.265625 0.734375 -0.75 1.21875q-0.484375 0.484375 -1.140625 0.734375q-0.65625 0.234375 -1.421875 0.234375q-0.359375 0 -0.703125 -0.046875q-0.34375 -0.03125 -0.703125 -0.125l0 3.078125l-1.28125 0l0 -10.359375l1.140625 0l0.078125 1.234375q0.546875 -0.75 1.171875 -1.046875q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.34375 0.15625 0.734375 0.25q0.390625 0.078125 0.765625 0.078125q1.03125 0 1.609375 -0.703125q0.59375 -0.703125 0.59375 -2.109375zm9.29245 3.75l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875z" fill-rule="nonzero"></path><path fill="#000000" d="m355.41818 343.88052l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.1987 3.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.620575 -3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm2.6987 0.234375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.245575 3.609375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151825 -2.40625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm2.85495 -1.203125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.401825 -0.203125q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.7612 1.640625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.026825 8.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058075 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 0.265625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.370575 -9.15625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.4487 4.953125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.1987 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm7.808075 2.796875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 -3.796875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm2.79245 0.734375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339325 -0.453125q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.6987 -4.90625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.558105 4.328125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.6250305 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.31253052 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.776855 0.953125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.839294 -0.8125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm14.94873 7.09375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058044 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058105 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm9.026855 8.34375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm10.167419 1.234375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9331055 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375z" fill-rule="nonzero"></path><path fill="#ffff00" d="m645.3884 332.9957l257.8584 0l0 17.16098l-257.8584 0l0 -17.16098z" fill-rule="nonzero"></path><path fill="#000000" d="m652.77905 341.47427q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.26123 -0.59375q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125zm8.245544 0.5q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.38623 -3.015625q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.401794 0.265625l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.026855 8.390625l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm7.9017944 -3.0625q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm7.8081055 2.796875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.620544 -3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm7.7924805 3.75l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.604919 3.34375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm1.5581055 -3.515625q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm6.7455444 0.09375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.808105 1.5l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.464294 -0.046875l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.120605 5.984375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm8.948669 2.046875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm1.9643555 -3.25q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.276794 -4.78125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm7.8706055 5.328125q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.308044 3.0625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm7.5581055 -0.265625q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.464355 -0.046875l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.120544 5.984375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.19873 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.245544 -5.328125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm8.120605 5.984375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.198669 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.308105 3.0625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm7.8705444 -2.90625q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125zm8.35498 -0.125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375z" fill-rule="nonzero"></path><path fill="#000000" d="m61.447918 383.88052l-1.75 0l-3.421875 -3.9375l0 3.9375l-1.28125 0l0 -10.34375l1.28125 0l0 6.359375l3.296875 -3.375l1.6875 0l-3.453125 3.390625l3.640625 3.96875zm7.667446 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171871 0q0 1.125 0.6249962 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6874962 -0.25 -1.1249962 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0624962 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.14062119 0.40625 -0.18749619 0.890625l3.8749962 0zm9.3862 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.4487 0.4375q0 0.984375 -0.28125 1.71875q-0.265625 0.734375 -0.75 1.21875q-0.484375 0.484375 -1.140625 0.734375q-0.65625 0.234375 -1.421875 0.234375q-0.359375 0 -0.703125 -0.046875q-0.34375 -0.03125 -0.703125 -0.125l0 3.078125l-1.28125 0l0 -10.359375l1.140625 0l0.078125 1.234375q0.546875 -0.75 1.171875 -1.046875q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.34375 0.15625 0.734375 0.25q0.390625 0.078125 0.765625 0.078125q1.03125 0 1.609375 -0.703125q0.59375 -0.703125 0.59375 -2.109375zm9.10495 0.84375q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125z" fill-rule="nonzero"></path><path fill="#000000" d="m355.41818 383.88052l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.1987 3.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.620575 -3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm2.6987 0.234375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.245575 3.609375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151825 -2.40625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm2.85495 -1.203125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.401825 -0.203125q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.7612 1.640625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.026825 8.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058075 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 0.265625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.370575 -9.15625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.4487 4.953125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.1987 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm7.808075 2.796875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 -3.796875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm2.79245 0.734375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339325 -0.453125q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.6987 -4.90625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.558105 4.328125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.6250305 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.31253052 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.776855 0.953125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.839294 -0.8125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm14.94873 7.09375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058044 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058105 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm9.026855 8.34375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm10.167419 1.234375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9331055 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375z" fill-rule="nonzero"></path><path fill="#000000" d="m652.6853 383.88052l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.620605 -2.109375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.276794 5.28125q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.41748 0.03125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.589294 -6.203125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm8.85498 3.84375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.245544 3.609375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.370605 -4.78125q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.261169 1.765625q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.245605 -2.265625q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.526794 4.84375q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm7.7924805 3.75l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.917419 -1.4375q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.01123 4.5625q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558044 -2.140625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.44873 2.3125l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm7.8080444 -3.0625q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.214355 3.0625l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151794 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm7.8862305 4.25l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm10.167419 1.234375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.339355 5.4375q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125zm1.6517944 -0.609375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.808105 1.5l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9330444 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.401855 -0.203125q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.604919 -5.40625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.51123 3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.401794 0.71875q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.276855 -1.109375q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.386169 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.38623 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0z" fill-rule="nonzero"></path><path fill="#000000" d="m61.447918 425.47632l-1.75 0l-3.421875 -3.9375l0 3.9375l-1.28125 0l0 -10.34375l1.28125 0l0 6.359375l3.296875 -3.375l1.6875 0l-3.453125 3.390625l3.640625 3.96875zm7.667446 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171871 0q0 1.125 0.6249962 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6874962 -0.25 -1.1249962 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0624962 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.14062119 0.40625 -0.18749619 0.890625l3.8749962 0zm9.3862 0.1875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.4487 0.4375q0 0.984375 -0.28125 1.71875q-0.265625 0.734375 -0.75 1.21875q-0.484375 0.484375 -1.140625 0.734375q-0.65625 0.234375 -1.421875 0.234375q-0.359375 0 -0.703125 -0.046875q-0.34375 -0.03125 -0.703125 -0.125l0 3.078125l-1.28125 0l0 -10.359375l1.140625 0l0.078125 1.234375q0.546875 -0.75 1.171875 -1.046875q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.34375 0.15625 0.734375 0.25q0.390625 0.078125 0.765625 0.078125q1.03125 0 1.609375 -0.703125q0.59375 -0.703125 0.59375 -2.109375zm9.7612 1.640625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375z" fill-rule="nonzero"></path><path fill="#000000" d="m355.41818 425.47632l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.1987 3.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.620575 -3.546875q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm2.6987 0.234375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.245575 3.609375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.151825 -2.40625q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm2.85495 -1.203125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.401825 -0.203125q0 0.921875 -0.25 1.640625q-0.25 0.71875 -0.71875 1.21875q-0.46875 0.5 -1.140625 0.78125q-0.65625 0.265625 -1.484375 0.265625q-0.65625 0 -1.34375 -0.125q-0.671875 -0.125 -1.34375 -0.40625l0 -9.90625l1.28125 0l0 2.84375l-0.0625 1.359375q0.546875 -0.734375 1.171875 -1.03125q0.625 -0.3125 1.34375 -0.3125q0.625 0 1.09375 0.265625q0.484375 0.265625 0.8125 0.75q0.328125 0.46875 0.484375 1.15625q0.15625 0.671875 0.15625 1.5zm-1.296875 0.0625q0 -0.578125 -0.09375 -1.0625q-0.078125 -0.484375 -0.265625 -0.828125q-0.171875 -0.34375 -0.46875 -0.53125q-0.28125 -0.203125 -0.671875 -0.203125q-0.25 0 -0.5 0.078125q-0.25 0.078125 -0.515625 0.265625q-0.265625 0.171875 -0.5625 0.46875q-0.296875 0.296875 -0.625 0.734375l0 3.5625q0.359375 0.15625 0.75 0.25q0.390625 0.078125 0.75 0.078125q0.4375 0 0.828125 -0.140625q0.40625 -0.140625 0.703125 -0.46875q0.3125 -0.328125 0.484375 -0.859375q0.1875 -0.546875 0.1875 -1.34375zm9.7612 1.640625l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.026825 8.078125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058075 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 0.265625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.370575 -9.15625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.4487 4.953125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.1987 -0.75q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm7.808075 2.796875q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558075 -3.796875q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm2.79245 0.734375q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339325 -0.453125q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.6987 -4.90625q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm15.558105 4.328125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.6250305 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.31253052 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.776855 0.953125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.839294 -0.8125q-1.015625 -0.21875 -1.734375 -0.21875q-1.71875 0 -1.71875 1.796875l0 1.296875l3.21875 0l0 1.0625l-3.21875 0l0 5.21875l-1.296875 0l0 -5.21875l-2.359375 0l0 -1.0625l2.359375 0l0 -1.21875q0 -2.9375 3.0625 -2.9375q0.765625 0 1.6875 0.171875l0 1.109375zm-7.703125 1.796875l0 0zm14.94873 7.09375q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058044 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058105 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm9.026794 -1.84375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm9.026855 8.34375l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm10.167419 1.234375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9331055 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.339294 1.203125q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375z" fill-rule="nonzero"></path><path fill="#ffff00" d="m645.3884 414.5915l257.8584 0l0 17.16098l-257.8584 0l0 -17.16098z" fill-rule="nonzero"></path><path fill="#000000" d="m652.59155 422.57007q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125zm8.245605 2.90625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm7.8080444 -3.0625q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.776855 0.953125l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm3.9330444 4.828125q0 -0.9375 0.25 -1.671875q0.265625 -0.734375 0.734375 -1.234375q0.46875 -0.5 1.125 -0.75q0.671875 -0.265625 1.484375 -0.265625q0.359375 0 0.6875 0.046875q0.34375 0.03125 0.671875 0.125l0 -3.078125l1.28125 0l0 10.34375l-1.140625 0l-0.03125 -1.390625q-0.546875 0.78125 -1.171875 1.15625q-0.609375 0.359375 -1.34375 0.359375q-0.625 0 -1.109375 -0.25q-0.46875 -0.265625 -0.796875 -0.75q-0.3125 -0.484375 -0.484375 -1.15625q-0.15625 -0.671875 -0.15625 -1.484375zm1.3125 -0.09375q0 1.34375 0.390625 2.0q0.390625 0.65625 1.109375 0.65625q0.484375 0 1.015625 -0.4375q0.53125 -0.4375 1.125 -1.28125l0 -3.421875q-0.3125 -0.140625 -0.6875 -0.21875q-0.375 -0.078125 -0.75 -0.078125q-1.046875 0 -1.625 0.671875q-0.578125 0.671875 -0.578125 2.109375zm13.276855 -4.78125l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm7.6205444 8.125q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.370605 -2.640625q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125zm7.7455444 2.640625q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.058105 0q-0.5 0.1875 -1.03125 0.28125q-0.515625 0.09375 -1.078125 0.09375q-1.734375 0 -2.6875 -0.9375q-0.9375 -0.953125 -0.9375 -2.78125q0 -0.859375 0.265625 -1.5625q0.28125 -0.71875 0.765625 -1.21875q0.5 -0.515625 1.171875 -0.78125q0.6875 -0.28125 1.5 -0.28125q0.578125 0 1.078125 0.078125q0.5 0.078125 0.953125 0.265625l0 1.21875q-0.484375 -0.25 -0.984375 -0.359375q-0.484375 -0.125 -1.015625 -0.125q-0.484375 0 -0.921875 0.1875q-0.4375 0.1875 -0.765625 0.546875q-0.328125 0.34375 -0.53125 0.859375q-0.1875 0.5 -0.1875 1.140625q0 1.328125 0.640625 2.0q0.65625 0.65625 1.8125 0.65625q0.515625 0 1.0 -0.109375q0.5 -0.125 0.953125 -0.359375l0 1.1875zm8.558044 0.265625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.058105 -4.0625q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.604919 -0.53125q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.620605 1.796875q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.526855 -1.71875q0 1.09375 -0.234375 2.0q-0.21875 0.90625 -0.671875 1.5625q-0.4375 0.640625 -1.109375 1.0q-0.65625 0.34375 -1.546875 0.34375q-0.765625 0 -1.40625 -0.28125q-0.625 -0.296875 -1.078125 -0.890625q-0.4375 -0.59375 -0.6875 -1.53125q-0.234375 -0.9375 -0.234375 -2.203125q0 -1.09375 0.21875 -2.0q0.234375 -0.921875 0.671875 -1.5625q0.453125 -0.65625 1.109375 -1.0q0.671875 -0.359375 1.5625 -0.359375q0.765625 0 1.390625 0.296875q0.625 0.28125 1.078125 0.890625q0.453125 0.59375 0.6875 1.53125q0.25 0.921875 0.25 2.203125zm-1.296875 0.046875q0 -0.25 -0.015625 -0.5q-0.015625 -0.25 -0.046875 -0.484375l-4.046875 3.015625q0.109375 0.375 0.28125 0.703125q0.171875 0.328125 0.40625 0.5625q0.234375 0.21875 0.53125 0.359375q0.3125 0.125 0.703125 0.125q0.5 0 0.90625 -0.234375q0.40625 -0.25 0.6875 -0.71875q0.28125 -0.484375 0.4375 -1.1875q0.15625 -0.71875 0.15625 -1.640625zm-4.375 -0.09375q0 0.234375 0 0.46875q0 0.21875 0.03125 0.421875l4.046875 -2.984375q-0.109375 -0.375 -0.28125 -0.6875q-0.171875 -0.3125 -0.40625 -0.53125q-0.234375 -0.21875 -0.53125 -0.34375q-0.296875 -0.125 -0.671875 -0.125q-0.5 0 -0.90625 0.25q-0.40625 0.234375 -0.703125 0.71875q-0.28125 0.46875 -0.4375 1.1875q-0.140625 0.703125 -0.140625 1.625zm13.511169 4.828125l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm8.526855 -2.109375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.636169 5.3125q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.183105 2.953125l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.620544 -2.109375l-1.640625 0l0 2.109375l-1.296875 0l0 -2.109375l-4.609375 0l0 -1.125l4.078125 -6.34375l1.828125 0l0 6.34375l1.640625 0l0 1.125zm-2.9375 -6.234375l-3.328125 5.109375l3.328125 0l0 -5.109375zm10.433105 8.34375l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.089294 -5.328125q0 1.40625 -0.34375 2.421875q-0.328125 1.0 -0.984375 1.65625q-0.65625 0.640625 -1.640625 0.953125q-0.96875 0.296875 -2.25 0.296875l-0.796875 0l0 -1.109375l0.890625 0q0.953125 0 1.640625 -0.1875q0.6875 -0.203125 1.140625 -0.5625q0.453125 -0.375 0.6875 -0.90625q0.25 -0.53125 0.3125 -1.21875l0.03125 -0.296875q-0.46875 0.28125 -1.078125 0.453125q-0.59375 0.15625 -1.296875 0.15625q-0.71875 0 -1.265625 -0.21875q-0.546875 -0.21875 -0.921875 -0.59375q-0.359375 -0.375 -0.546875 -0.890625q-0.171875 -0.53125 -0.171875 -1.15625q0 -0.65625 0.234375 -1.234375q0.25 -0.578125 0.6875 -1.0q0.4375 -0.4375 1.03125 -0.6875q0.609375 -0.25 1.34375 -0.25q0.71875 0 1.3125 0.234375q0.609375 0.234375 1.046875 0.765625q0.4375 0.515625 0.6875 1.359375q0.25 0.828125 0.25 2.015625zm-3.34375 -3.328125q-0.421875 0 -0.765625 0.140625q-0.34375 0.125 -0.609375 0.390625q-0.25 0.265625 -0.390625 0.640625q-0.140625 0.375 -0.140625 0.875q0 0.4375 0.09375 0.796875q0.109375 0.34375 0.328125 0.59375q0.234375 0.25 0.578125 0.390625q0.359375 0.125 0.84375 0.125q0.265625 0 0.546875 -0.046875q0.296875 -0.0625 0.5625 -0.140625q0.28125 -0.09375 0.53125 -0.203125q0.25 -0.125 0.453125 -0.265625q0 -0.9375 -0.140625 -1.5625q-0.140625 -0.640625 -0.40625 -1.015625q-0.265625 -0.390625 -0.640625 -0.546875q-0.375 -0.171875 -0.84375 -0.171875zm11.464355 8.65625l-6.3125 0l0 -1.140625l2.46875 -2.46875q0.609375 -0.59375 0.984375 -1.03125q0.390625 -0.4375 0.59375 -0.796875q0.21875 -0.375 0.296875 -0.6875q0.078125 -0.328125 0.078125 -0.703125q0 -0.34375 -0.109375 -0.65625q-0.09375 -0.328125 -0.296875 -0.5625q-0.1875 -0.25 -0.5 -0.390625q-0.3125 -0.140625 -0.75 -0.140625q-0.609375 0 -1.109375 0.28125q-0.5 0.265625 -0.921875 0.6875l-0.703125 -0.828125q0.546875 -0.578125 1.25 -0.921875q0.703125 -0.34375 1.640625 -0.34375q0.640625 0 1.15625 0.1875q0.53125 0.1875 0.90625 0.546875q0.390625 0.359375 0.59375 0.890625q0.21875 0.515625 0.21875 1.15625q0 0.5625 -0.15625 1.03125q-0.140625 0.46875 -0.4375 0.9375q-0.296875 0.453125 -0.75 0.953125q-0.453125 0.5 -1.0625 1.09375l-1.734375 1.6875l4.65625 0l0 1.21875zm7.9642944 0l-6.0 0l0 -1.1875l2.453125 0l0 -6.984375l-2.296875 1.25l-0.46875 -1.09375l3.046875 -1.59375l1.125 0l0 8.421875l2.140625 0l0 1.1875zm8.089355 -8.390625l-4.015625 8.390625l-1.453125 0l4.171875 -8.390625l-5.171875 0l0 -1.1875l6.46875 0l0 1.1875zm6.6205444 8.390625l-0.03125 -0.984375q-0.59375 0.59375 -1.21875 0.859375q-0.609375 0.25 -1.296875 0.25q-0.625 0 -1.078125 -0.15625q-0.4375 -0.15625 -0.734375 -0.4375q-0.28125 -0.28125 -0.421875 -0.65625q-0.140625 -0.390625 -0.140625 -0.84375q0 -1.09375 0.828125 -1.71875q0.828125 -0.640625 2.4375 -0.640625l1.515625 0l0 -0.640625q0 -0.65625 -0.421875 -1.046875q-0.40625 -0.390625 -1.265625 -0.390625q-0.625 0 -1.234375 0.140625q-0.59375 0.140625 -1.234375 0.40625l0 -1.15625q0.234375 -0.09375 0.53125 -0.171875q0.296875 -0.078125 0.625 -0.140625q0.328125 -0.078125 0.6875 -0.109375q0.359375 -0.046875 0.734375 -0.046875q0.65625 0 1.1875 0.15625q0.546875 0.140625 0.90625 0.4375q0.375 0.296875 0.5625 0.75q0.203125 0.453125 0.203125 1.078125l0 5.0625l-1.140625 0zm-0.140625 -3.34375l-1.609375 0q-0.484375 0 -0.828125 0.09375q-0.34375 0.09375 -0.5625 0.265625q-0.21875 0.171875 -0.328125 0.421875q-0.09375 0.25 -0.09375 0.5625q0 0.203125 0.0625 0.40625q0.0625 0.1875 0.203125 0.34375q0.15625 0.140625 0.390625 0.234375q0.234375 0.078125 0.5625 0.078125q0.4375 0 1.0 -0.265625q0.578125 -0.265625 1.203125 -0.84375l0 -1.296875zm9.69873 0.9375q0 0.609375 -0.25 1.09375q-0.25 0.46875 -0.703125 0.796875q-0.453125 0.3125 -1.0625 0.484375q-0.59375 0.15625 -1.3125 0.15625q-0.78125 0 -1.375 -0.171875q-0.59375 -0.171875 -1.0 -0.484375q-0.40625 -0.3125 -0.609375 -0.75q-0.203125 -0.4375 -0.203125 -0.953125q0 -0.875 0.484375 -1.515625q0.5 -0.640625 1.515625 -1.15625q-0.9375 -0.484375 -1.375 -1.0625q-0.421875 -0.578125 -0.421875 -1.328125q0 -0.46875 0.1875 -0.890625q0.1875 -0.4375 0.578125 -0.765625q0.390625 -0.34375 0.96875 -0.546875q0.578125 -0.203125 1.359375 -0.203125q0.734375 0 1.296875 0.15625q0.5625 0.15625 0.9375 0.453125q0.390625 0.296875 0.578125 0.71875q0.1875 0.40625 0.1875 0.921875q0 0.828125 -0.46875 1.421875q-0.46875 0.578125 -1.3125 1.015625q0.421875 0.21875 0.78125 0.484375q0.375 0.25 0.640625 0.5625q0.265625 0.3125 0.421875 0.703125q0.15625 0.390625 0.15625 0.859375zm-1.53125 -4.953125q0 -0.640625 -0.453125 -0.953125q-0.453125 -0.328125 -1.28125 -0.328125q-0.828125 0 -1.28125 0.3125q-0.453125 0.3125 -0.453125 0.9375q0 0.296875 0.109375 0.546875q0.109375 0.234375 0.328125 0.453125q0.234375 0.203125 0.578125 0.40625q0.34375 0.203125 0.828125 0.421875q0.828125 -0.390625 1.21875 -0.8125q0.40625 -0.421875 0.40625 -0.984375zm0.140625 5.046875q0 -0.265625 -0.09375 -0.515625q-0.078125 -0.265625 -0.3125 -0.515625q-0.21875 -0.25 -0.609375 -0.5q-0.375 -0.25 -0.96875 -0.5q-0.5 0.234375 -0.84375 0.46875q-0.328125 0.234375 -0.546875 0.484375q-0.203125 0.25 -0.296875 0.515625q-0.078125 0.265625 -0.078125 0.546875q0 0.328125 0.140625 0.59375q0.140625 0.25 0.390625 0.421875q0.25 0.171875 0.59375 0.265625q0.34375 0.09375 0.75 0.09375q0.390625 0 0.734375 -0.078125q0.34375 -0.09375 0.59375 -0.25q0.25 -0.171875 0.390625 -0.421875q0.15625 -0.25 0.15625 -0.609375zm9.448669 -1.75q0 0.265625 -0.015625 0.453125q0 0.1875 -0.015625 0.34375l-5.171875 0q0 1.125 0.625 1.734375q0.640625 0.59375 1.828125 0.59375q0.3125 0 0.640625 -0.015625q0.328125 -0.03125 0.625 -0.0625q0.296875 -0.046875 0.5625 -0.09375q0.28125 -0.0625 0.515625 -0.140625l0 1.046875q-0.515625 0.15625 -1.171875 0.234375q-0.65625 0.09375 -1.359375 0.09375q-0.9375 0 -1.625 -0.25q-0.6875 -0.25 -1.125 -0.734375q-0.421875 -0.5 -0.640625 -1.203125q-0.203125 -0.703125 -0.203125 -1.59375q0 -0.78125 0.21875 -1.46875q0.21875 -0.703125 0.640625 -1.21875q0.4375 -0.53125 1.0625 -0.828125q0.625 -0.3125 1.421875 -0.3125q0.765625 0 1.359375 0.25q0.59375 0.234375 1.0 0.6875q0.40625 0.4375 0.609375 1.078125q0.21875 0.625 0.21875 1.40625zm-1.328125 -0.1875q0.015625 -0.484375 -0.109375 -0.890625q-0.109375 -0.40625 -0.359375 -0.703125q-0.234375 -0.296875 -0.609375 -0.453125q-0.359375 -0.171875 -0.84375 -0.171875q-0.421875 0 -0.765625 0.171875q-0.34375 0.15625 -0.59375 0.453125q-0.25 0.28125 -0.40625 0.703125q-0.140625 0.40625 -0.1875 0.890625l3.875 0zm9.495605 1.21875q0 0.65625 -0.234375 1.234375q-0.234375 0.578125 -0.6875 1.015625q-0.4375 0.421875 -1.0625 0.671875q-0.609375 0.234375 -1.359375 0.234375q-0.796875 0 -1.40625 -0.25q-0.609375 -0.25 -1.015625 -0.765625q-0.40625 -0.53125 -0.625 -1.328125q-0.203125 -0.796875 -0.203125 -1.890625q0 -0.734375 0.09375 -1.421875q0.09375 -0.6875 0.3125 -1.296875q0.21875 -0.609375 0.578125 -1.109375q0.375 -0.5 0.921875 -0.859375q0.546875 -0.375 1.28125 -0.578125q0.734375 -0.203125 1.71875 -0.203125l0.9375 0l0 1.125l-1.015625 0q-0.859375 0 -1.5 0.203125q-0.625 0.203125 -1.046875 0.578125q-0.421875 0.375 -0.65625 0.90625q-0.21875 0.515625 -0.28125 1.171875l-0.03125 0.296875q0.46875 -0.265625 1.0625 -0.421875q0.609375 -0.171875 1.3125 -0.171875q0.71875 0 1.265625 0.21875q0.546875 0.203125 0.90625 0.578125q0.375 0.375 0.546875 0.90625q0.1875 0.53125 0.1875 1.15625zm-1.328125 0.078125q0 -0.4375 -0.109375 -0.796875q-0.109375 -0.359375 -0.34375 -0.59375q-0.21875 -0.25 -0.5625 -0.375q-0.34375 -0.140625 -0.828125 -0.140625q-0.28125 0 -0.578125 0.046875q-0.28125 0.046875 -0.5625 0.140625q-0.265625 0.09375 -0.515625 0.21875q-0.25 0.109375 -0.453125 0.234375q0 0.953125 0.125 1.59375q0.140625 0.625 0.390625 1.015625q0.265625 0.375 0.640625 0.53125q0.390625 0.15625 0.890625 0.15625q0.421875 0 0.765625 -0.125q0.34375 -0.140625 0.59375 -0.40625q0.25 -0.265625 0.390625 -0.640625q0.15625 -0.375 0.15625 -0.859375zm9.026794 -0.109375q0 0.71875 -0.3125 1.3125q-0.296875 0.578125 -0.84375 1.0q-0.53125 0.40625 -1.265625 0.640625q-0.734375 0.234375 -1.578125 0.234375q-0.21875 0 -0.46875 -0.015625q-0.234375 0 -0.484375 -0.015625q-0.234375 -0.015625 -0.46875 -0.046875q-0.234375 -0.015625 -0.421875 -0.046875l0 -1.15625q0.40625 0.09375 0.90625 0.140625q0.515625 0.046875 1.03125 0.046875q0.59375 0 1.0625 -0.140625q0.46875 -0.140625 0.796875 -0.390625q0.328125 -0.265625 0.5 -0.640625q0.171875 -0.375 0.171875 -0.828125q0 -0.90625 -0.640625 -1.3125q-0.640625 -0.40625 -1.84375 -0.40625l-1.8125 0l0 -4.890625l5.15625 0l0 1.125l-3.953125 0l0 2.6875l0.84375 0q0.6875 0 1.328125 0.125q0.65625 0.125 1.15625 0.4375q0.515625 0.296875 0.828125 0.828125q0.3125 0.515625 0.3125 1.3125zm8.120605 0.15625q0 0.625 -0.265625 1.1875q-0.25 0.546875 -0.765625 0.96875q-0.515625 0.40625 -1.296875 0.640625q-0.765625 0.234375 -1.796875 0.234375q-0.578125 0 -1.03125 -0.03125q-0.453125 -0.03125 -0.84375 -0.09375l0 -1.140625q0.453125 0.078125 0.953125 0.125q0.515625 0.046875 1.03125 0.046875q0.71875 0 1.21875 -0.125q0.515625 -0.140625 0.84375 -0.375q0.328125 -0.25 0.46875 -0.59375q0.140625 -0.34375 0.140625 -0.765625q0 -0.40625 -0.171875 -0.6875q-0.171875 -0.296875 -0.5 -0.5q-0.3125 -0.203125 -0.765625 -0.296875q-0.4375 -0.09375 -0.953125 -0.09375l-1.09375 0l0 -1.046875l1.109375 0q0.421875 0 0.78125 -0.109375q0.359375 -0.125 0.609375 -0.328125q0.25 -0.21875 0.375 -0.53125q0.140625 -0.3125 0.140625 -0.703125q0 -0.765625 -0.46875 -1.109375q-0.46875 -0.359375 -1.375 -0.359375q-0.484375 0 -1.0 0.09375q-0.5 0.09375 -1.09375 0.28125l0 -1.109375q0.25 -0.09375 0.53125 -0.15625q0.28125 -0.078125 0.5625 -0.125q0.28125 -0.046875 0.5625 -0.0625q0.28125 -0.03125 0.53125 -0.03125q0.765625 0 1.34375 0.171875q0.578125 0.15625 0.96875 0.46875q0.390625 0.296875 0.578125 0.75q0.203125 0.4375 0.203125 0.984375q0 0.8125 -0.421875 1.375q-0.421875 0.5625 -1.15625 0.890625q0.375 0.046875 0.734375 0.234375q0.375 0.171875 0.65625 0.453125q0.296875 0.265625 0.46875 0.640625q0.1875 0.375 0.1875 0.828125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m284.04724 136.9462l391.90552 0l0 51.181107l-391.90552 0z" fill-rule="nonzero"></path><path fill="#000000" d="m319.1797 158.57675l-3.796875 -12.453125l2.171875 0l1.984375 7.1875l0.734375 2.671875q0.046875 -0.203125 0.640625 -2.5625l1.984375 -7.296875l2.171875 0l1.859375 7.21875l0.625 2.390625l0.71875 -2.40625l2.125 -7.203125l2.046875 0l-3.890625 12.453125l-2.1875 0l-1.984375 -7.453125l-0.46875 -2.125l-2.53125 9.578125l-2.203125 0zm23.566406 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm11.769531 -7.328125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm4.9414062 1.03125l2.046875 0.3125q0.125 0.9375 0.71875 1.375q0.78125 0.59375 2.140625 0.59375q1.46875 0 2.265625 -0.59375q0.796875 -0.578125 1.078125 -1.640625q0.15625 -0.640625 0.140625 -2.703125q-1.375 1.625 -3.4375 1.625q-2.5625 0 -3.96875 -1.84375q-1.40625 -1.859375 -1.40625 -4.453125q0 -1.78125 0.640625 -3.28125q0.640625 -1.515625 1.859375 -2.328125q1.234375 -0.828125 2.890625 -0.828125q2.203125 0 3.625 1.78125l0 -1.5l1.953125 0l0 10.765625q0 2.90625 -0.59375 4.109375q-0.59375 1.21875 -1.875 1.921875q-1.28125 0.703125 -3.15625 0.703125q-2.234375 0 -3.609375 -1.0q-1.359375 -1.0 -1.3125 -3.015625zm1.734375 -7.484375q0 2.453125 0.96875 3.578125q0.984375 1.125 2.453125 1.125q1.453125 0 2.4375 -1.109375q0.984375 -1.125 0.984375 -3.515625q0 -2.28125 -1.015625 -3.4375q-1.015625 -1.171875 -2.453125 -1.171875q-1.40625 0 -2.390625 1.140625q-0.984375 1.140625 -0.984375 3.390625zm11.988281 6.453125l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm17.957031 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm19.835938 -8.21875l-11.34375 0l0 -1.96875l11.34375 0l0 1.96875zm0 5.21875l-11.34375 0l0 -1.96875l11.34375 0l0 1.96875zm9.777344 4.890625l0 -17.1875l3.421875 0l4.0625 12.171875q0.5625 1.703125 0.828125 2.546875q0.296875 -0.9375 0.90625 -2.765625l4.125 -11.953125l3.046875 0l0 17.1875l-2.1875 0l0 -14.375l-4.984375 14.375l-2.0625 0l-4.96875 -14.625l0 14.625l-2.1875 0zm20.070312 0l0 -17.1875l5.90625 0q2.015625 0 3.0625 0.25q1.484375 0.34375 2.515625 1.234375q1.359375 1.140625 2.03125 2.9375q0.6875 1.78125 0.6875 4.078125q0 1.953125 -0.46875 3.46875q-0.453125 1.515625 -1.171875 2.515625q-0.703125 0.984375 -1.5625 1.546875q-0.84375 0.5625 -2.046875 0.859375q-1.203125 0.296875 -2.765625 0.296875l-6.1875 0zm2.265625 -2.03125l3.671875 0q1.703125 0 2.65625 -0.3125q0.96875 -0.3125 1.546875 -0.890625q0.8125 -0.8125 1.265625 -2.171875q0.453125 -1.375 0.453125 -3.3125q0 -2.703125 -0.890625 -4.140625q-0.890625 -1.453125 -2.15625 -1.9375q-0.90625 -0.359375 -2.9375 -0.359375l-3.609375 0l0 13.125zm14.207031 -2.46875l2.21875 -0.1875q0.234375 1.609375 1.125 2.4375q0.90625 0.8125 2.171875 0.8125q1.53125 0 2.578125 -1.140625q1.0625 -1.15625 1.0625 -3.0625q0 -1.796875 -1.015625 -2.84375q-1.015625 -1.046875 -2.65625 -1.046875q-1.015625 0 -1.84375 0.46875q-0.8125 0.453125 -1.28125 1.203125l-1.984375 -0.265625l1.65625 -8.828125l8.546875 0l0 2.015625l-6.859375 0l-0.921875 4.625q1.546875 -1.078125 3.25 -1.078125q2.25 0 3.796875 1.5625q1.546875 1.546875 1.546875 4.0q0 2.328125 -1.359375 4.03125q-1.65625 2.09375 -4.515625 2.09375q-2.34375 0 -3.828125 -1.3125q-1.484375 -1.3125 -1.6875 -3.484375zm17.957031 9.546875q-1.734375 -2.203125 -2.953125 -5.15625q-1.203125 -2.953125 -1.203125 -6.109375q0 -2.796875 0.90625 -5.34375q1.046875 -2.96875 3.25 -5.90625l1.515625 0q-1.421875 2.4375 -1.875 3.46875q-0.71875 1.625 -1.125 3.375q-0.5 2.203125 -0.5 4.40625q0 5.640625 3.5 11.265625l-1.515625 0zm4.6171875 -5.046875l0 -17.1875l2.28125 0l0 17.1875l-2.28125 0zm6.2929688 0l0 -17.1875l5.90625 0q2.015625 0 3.0625 0.25q1.484375 0.34375 2.515625 1.234375q1.359375 1.140625 2.03125 2.9375q0.6875 1.78125 0.6875 4.078125q0 1.953125 -0.46875 3.46875q-0.453125 1.515625 -1.171875 2.515625q-0.703125 0.984375 -1.5625 1.546875q-0.84375 0.5625 -2.046875 0.859375q-1.203125 0.296875 -2.765625 0.296875l-6.1875 0zm2.265625 -2.03125l3.671875 0q1.703125 0 2.65625 -0.3125q0.96875 -0.3125 1.546875 -0.890625q0.8125 -0.8125 1.265625 -2.171875q0.453125 -1.375 0.453125 -3.3125q0 -2.703125 -0.890625 -4.140625q-0.890625 -1.453125 -2.15625 -1.9375q-0.90625 -0.359375 -2.9375 -0.359375l-3.609375 0l0 13.125zm18.816406 7.078125q-1.734375 -2.203125 -2.953125 -5.15625q-1.203125 -2.953125 -1.203125 -6.109375q0 -2.796875 0.90625 -5.34375q1.046875 -2.96875 3.25 -5.90625l1.515625 0q-1.421875 2.4375 -1.875 3.46875q-0.71875 1.625 -1.125 3.375q-0.5 2.203125 -0.5 4.40625q0 5.640625 3.5 11.265625l-1.515625 0zm3.4609375 -10.5625l2.140625 -0.1875q0.15625 1.28125 0.703125 2.109375q0.5625 0.828125 1.734375 1.34375q1.171875 0.5 2.640625 0.5q1.296875 0 2.296875 -0.375q1.0 -0.390625 1.484375 -1.0625q0.484375 -0.6875 0.484375 -1.484375q0 -0.796875 -0.46875 -1.40625q-0.46875 -0.609375 -1.546875 -1.015625q-0.6875 -0.265625 -3.0625 -0.828125q-2.359375 -0.578125 -3.3125 -1.078125q-1.234375 -0.640625 -1.84375 -1.59375q-0.59375 -0.96875 -0.59375 -2.140625q0 -1.3125 0.734375 -2.4375q0.75 -1.125 2.15625 -1.703125q1.421875 -0.59375 3.15625 -0.59375q1.90625 0 3.359375 0.609375q1.46875 0.609375 2.25 1.8125q0.796875 1.1875 0.84375 2.703125l-2.171875 0.171875q-0.171875 -1.640625 -1.1875 -2.46875q-1.015625 -0.828125 -3.0 -0.828125q-2.0625 0 -3.015625 0.765625q-0.9375 0.75 -0.9375 1.8125q0 0.921875 0.671875 1.515625q0.65625 0.609375 3.421875 1.234375q2.78125 0.625 3.8125 1.09375q1.5 0.6875 2.203125 1.75q0.71875 1.0625 0.71875 2.4375q0 1.375 -0.78125 2.59375q-0.78125 1.203125 -2.25 1.890625q-1.46875 0.671875 -3.3125 0.671875q-2.328125 0 -3.90625 -0.671875q-1.578125 -0.6875 -2.484375 -2.046875q-0.890625 -1.375 -0.9375 -3.09375zm17.898438 10.5625l-1.515625 0q3.5 -5.625 3.5 -11.265625q0 -2.203125 -0.5 -4.359375q-0.390625 -1.765625 -1.109375 -3.375q-0.453125 -1.0625 -1.890625 -3.515625l1.515625 0q2.203125 2.9375 3.25 5.90625q0.90625 2.546875 0.90625 5.34375q0 3.15625 -1.21875 6.109375q-1.203125 2.953125 -2.9375 5.15625zm17.707031 -7.828125l0 -4.703125l-4.671875 0l0 -1.96875l4.671875 0l0 -4.6875l1.984375 0l0 4.6875l4.6875 0l0 1.96875l-4.6875 0l0 4.703125l-1.984375 0zm16.449219 2.78125l0 -17.1875l3.421875 0l4.0625 12.171875q0.5625 1.703125 0.828125 2.546875q0.296875 -0.9375 0.90625 -2.765625l4.125 -11.953125l3.046875 0l0 17.1875l-2.1875 0l0 -14.375l-4.984375 14.375l-2.0625 0l-4.96875 -14.625l0 14.625l-2.1875 0zm20.070312 0l0 -17.1875l5.90625 0q2.015625 0 3.0625 0.25q1.484375 0.34375 2.515625 1.234375q1.359375 1.140625 2.03125 2.9375q0.6875 1.78125 0.6875 4.078125q0 1.953125 -0.46875 3.46875q-0.453125 1.515625 -1.171875 2.515625q-0.703125 0.984375 -1.5625 1.546875q-0.84375 0.5625 -2.046875 0.859375q-1.203125 0.296875 -2.765625 0.296875l-6.1875 0zm2.265625 -2.03125l3.671875 0q1.703125 0 2.65625 -0.3125q0.96875 -0.3125 1.546875 -0.890625q0.8125 -0.8125 1.265625 -2.171875q0.453125 -1.375 0.453125 -3.3125q0 -2.703125 -0.890625 -4.140625q-0.890625 -1.453125 -2.15625 -1.9375q-0.90625 -0.359375 -2.9375 -0.359375l-3.609375 0l0 13.125zm14.207031 -2.46875l2.21875 -0.1875q0.234375 1.609375 1.125 2.4375q0.90625 0.8125 2.171875 0.8125q1.53125 0 2.578125 -1.140625q1.0625 -1.15625 1.0625 -3.0625q0 -1.796875 -1.015625 -2.84375q-1.015625 -1.046875 -2.65625 -1.046875q-1.015625 0 -1.84375 0.46875q-0.8125 0.453125 -1.28125 1.203125l-1.984375 -0.265625l1.65625 -8.828125l8.546875 0l0 2.015625l-6.859375 0l-0.921875 4.625q1.546875 -1.078125 3.25 -1.078125q2.25 0 3.796875 1.5625q1.546875 1.546875 1.546875 4.0q0 2.328125 -1.359375 4.03125q-1.65625 2.09375 -4.515625 2.09375q-2.34375 0 -3.828125 -1.3125q-1.484375 -1.3125 -1.6875 -3.484375zm17.957031 9.546875q-1.734375 -2.203125 -2.953125 -5.15625q-1.203125 -2.953125 -1.203125 -6.109375q0 -2.796875 0.90625 -5.34375q1.046875 -2.96875 3.25 -5.90625l1.515625 0q-1.421875 2.4375 -1.875 3.46875q-0.71875 1.625 -1.125 3.375q-0.5 2.203125 -0.5 4.40625q0 5.640625 3.5 11.265625l-1.515625 0zm4.1484375 -5.046875l0 -17.1875l6.4375 0q1.96875 0 3.15625 0.53125q1.1875 0.515625 1.859375 1.609375q0.6875 1.078125 0.6875 2.265625q0 1.09375 -0.609375 2.078125q-0.59375 0.96875 -1.796875 1.5625q1.5625 0.453125 2.390625 1.5625q0.84375 1.09375 0.84375 2.59375q0 1.203125 -0.515625 2.25q-0.5 1.03125 -1.25 1.59375q-0.75 0.5625 -1.890625 0.859375q-1.125 0.28125 -2.765625 0.28125l-6.546875 0zm2.265625 -9.96875l3.71875 0q1.515625 0 2.171875 -0.1875q0.859375 -0.265625 1.296875 -0.859375q0.4375 -0.59375 0.4375 -1.5q0 -0.859375 -0.40625 -1.5q-0.40625 -0.65625 -1.171875 -0.890625q-0.765625 -0.25 -2.609375 -0.25l-3.4375 0l0 5.1875zm0 7.9375l4.28125 0q1.09375 0 1.546875 -0.078125q0.78125 -0.140625 1.3125 -0.46875q0.53125 -0.328125 0.859375 -0.953125q0.34375 -0.625 0.34375 -1.453125q0 -0.953125 -0.5 -1.65625q-0.484375 -0.71875 -1.359375 -1.0q-0.875 -0.296875 -2.515625 -0.296875l-3.96875 0l0 5.90625zm14.9453125 7.078125l-1.515625 0q3.5 -5.625 3.5 -11.265625q0 -2.203125 -0.5 -4.359375q-0.390625 -1.765625 -1.109375 -3.375q-0.453125 -1.0625 -1.890625 -3.515625l1.515625 0q2.203125 2.9375 3.25 5.90625q0.90625 2.546875 0.90625 5.34375q0 3.15625 -1.21875 6.109375q-1.203125 2.953125 -2.9375 5.15625zm7.9921875 0l-1.515625 0q3.5 -5.625 3.5 -11.265625q0 -2.203125 -0.5 -4.359375q-0.390625 -1.765625 -1.109375 -3.375q-0.453125 -1.0625 -1.890625 -3.515625l1.515625 0q2.203125 2.9375 3.25 5.90625q0.90625 2.546875 0.90625 5.34375q0 3.15625 -1.21875 6.109375q-1.203125 2.953125 -2.9375 5.15625z" fill-rule="nonzero"></path></g></svg>
+
diff --git a/doc/images/Session_Establishment.svg b/doc/images/Session_Establishment.svg
new file mode 100644 (file)
index 0000000..e60cb9b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 1338.0 1283.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l1338.0 0l0 1283.0l-1338.0 0l0 -1283.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l1338.0 0l0 1283.0l-1338.0 0z" fill-rule="nonzero"></path><path fill="#d9ead3" d="m529.084 59.792652l179.27557 0l0 94.645676l-179.27557 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m529.084 59.792652l179.27557 0l0 94.645676l-179.27557 0z" fill-rule="nonzero"></path><path fill="#000000" d="m573.0276 114.035484l-3.609375 -13.59375l1.84375 0l2.0625 8.90625q0.34375 1.40625 0.578125 2.78125q0.515625 -2.171875 0.609375 -2.515625l2.59375 -9.171875l2.171875 0l1.953125 6.875q0.734375 2.5625 1.046875 4.8125q0.265625 -1.28125 0.6875 -2.953125l2.125 -8.734375l1.8125 0l-3.734375 13.59375l-1.734375 0l-2.859375 -10.359375q-0.359375 -1.296875 -0.421875 -1.59375q-0.21875 0.9375 -0.40625 1.59375l-2.890625 10.359375l-1.828125 0zm14.389893 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.266357 4.921875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.2438965 0l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm10.859375 0l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm15.594482 1.828125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813171 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.890625 3.609375l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m186.2126 85.77165l342.2677 2.708664" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m186.2126 85.77165l336.26794 2.6611862" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m522.4674 90.08451l4.5510254 -1.6157684l-4.5248413 -1.6875916z" fill-rule="evenodd"></path><path fill="#d9ead3" d="m464.64304 281.8714l154.07877 -82.47244l154.07874 82.47244l-154.07874 82.47244z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m464.64304 281.8714l154.07877 -82.47244l154.07874 82.47244l-154.07874 82.47244z" fill-rule="nonzero"></path><path fill="#000000" d="m550.6512 266.79138l5.234375 -13.593735l1.9375 0l5.5625 13.593735l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.7031097 -0.96875 -2.8124847q-0.265625 1.3125 -0.734375 2.5937347l-1.5 4.0zm9.8029175 5.578125l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm9.750732 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm10.297546 3.796875l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm9.40625 -3.796875l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm14.9158325 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.735107 4.921875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.2506714 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375z" fill-rule="nonzero"></path><path fill="#000000" d="m558.36993 287.57263q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.516296 1.328125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 0l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.328125 0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm21.933289 -0.234375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm5.6257324 4.9375l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm8.813171 5.0l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.926086 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375z" fill-rule="nonzero"></path><path fill="#000000" d="m559.7137 309.182q-0.828125 0.921875 -1.8125 1.390625q-0.96875 0.453125 -2.09375 0.453125q-2.09375 0 -3.3125 -1.40625q-1.0 -1.15625 -1.0 -2.578125q0 -1.265625 0.8125 -2.28125q0.8125 -1.015625 2.421875 -1.78125q-0.90625 -1.0625 -1.21875 -1.71875q-0.296875 -0.65625 -0.296875 -1.265625q0 -1.234375 0.953125 -2.125q0.953125 -0.90625 2.421875 -0.90625q1.390625 0 2.265625 0.859375q0.890625 0.84375 0.890625 2.046875q0 1.9375 -2.5625 3.3125l2.4375 3.09375q0.421875 -0.8125 0.640625 -1.890625l1.734375 0.375q-0.4375 1.78125 -1.203125 2.9375q0.9375 1.234375 2.125 2.078125l-1.125 1.328125q-1.0 -0.640625 -2.078125 -1.921875zm-3.40625 -7.078125q1.09375 -0.640625 1.40625 -1.125q0.328125 -0.484375 0.328125 -1.0625q0 -0.703125 -0.453125 -1.140625q-0.4375 -0.4375 -1.09375 -0.4375q-0.671875 0 -1.125 0.4375q-0.453125 0.421875 -0.453125 1.0625q0 0.3125 0.15625 0.65625q0.171875 0.34375 0.5 0.734375l0.734375 0.875zm2.359375 5.765625l-3.0625 -3.796875q-1.359375 0.8125 -1.84375 1.5q-0.46875 0.6875 -0.46875 1.375q0 0.8125 0.65625 1.703125q0.671875 0.890625 1.875 0.890625q0.75 0 1.546875 -0.46875q0.8125 -0.46875 1.296875 -1.203125zm17.329956 1.703125q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.516357 1.328125l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.328125 0l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.328125 0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.015625 -8.75l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm5.6760864 0l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm8.813171 5.0l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.926086 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm12.235107 2.53125q0 -0.34375 0 -0.5q0 -0.984375 0.265625 -1.703125q0.21875 -0.546875 0.671875 -1.09375q0.328125 -0.390625 1.1875 -1.15625q0.875 -0.765625 1.125 -1.21875q0.265625 -0.453125 0.265625 -1.0q0 -0.96875 -0.765625 -1.703125q-0.75 -0.734375 -1.859375 -0.734375q-1.0625 0 -1.78125 0.671875q-0.703125 0.65625 -0.9375 2.078125l-1.71875 -0.203125q0.234375 -1.90625 1.375 -2.90625q1.15625 -1.015625 3.03125 -1.015625q2.0 0 3.1875 1.09375q1.1875 1.078125 1.1875 2.609375q0 0.890625 -0.421875 1.640625q-0.40625 0.75 -1.625 1.828125q-0.8125 0.734375 -1.0625 1.078125q-0.25 0.34375 -0.375 0.796875q-0.125 0.4375 -0.140625 1.4375l-1.609375 0zm-0.09375 3.34375l0 -1.90625l1.890625 0l0 1.90625l-1.890625 0z" fill-rule="nonzero"></path><path fill="#d9ead3" d="m848.9265 239.90552l156.34644 0l0 88.59842l-156.34644 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m848.9265 239.90552l156.34644 0l0 88.59842l-156.34644 0z" fill-rule="nonzero"></path><path fill="#000000" d="m865.75464 274.7966l0 -1.609375l5.765625 0l0 5.046875q-1.328125 1.0625 -2.75 1.59375q-1.40625 0.53125 -2.890625 0.53125q-2.0 0 -3.640625 -0.859375q-1.625 -0.859375 -2.46875 -2.484375q-0.828125 -1.625 -0.828125 -3.625q0 -1.984375 0.828125 -3.703125q0.828125 -1.71875 2.390625 -2.546875q1.5625 -0.84375 3.59375 -0.84375q1.46875 0 2.65625 0.484375q1.203125 0.46875 1.875 1.328125q0.671875 0.84375 1.03125 2.21875l-1.625 0.4375q-0.3125 -1.03125 -0.765625 -1.625q-0.453125 -0.59375 -1.296875 -0.953125q-0.84375 -0.359375 -1.875 -0.359375q-1.234375 0 -2.140625 0.375q-0.890625 0.375 -1.453125 1.0q-0.546875 0.609375 -0.84375 1.34375q-0.53125 1.25 -0.53125 2.734375q0 1.8125 0.625 3.046875q0.640625 1.21875 1.828125 1.8125q1.203125 0.59375 2.546875 0.59375q1.171875 0 2.28125 -0.453125q1.109375 -0.453125 1.6875 -0.953125l0 -2.53125l-4.0 0zm14.683289 2.15625l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm12.766357 4.375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm6.694702 1.5l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9783325 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.375 -1.984375q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.735046 4.921875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.9069824 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.6658325 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#000000" d="m859.58276 302.12473l0 -8.546875l-1.484375 0l0 -1.3125l1.484375 0l0 -1.046875q0 -0.984375 0.171875 -1.46875q0.234375 -0.65625 0.84375 -1.046875q0.609375 -0.40625 1.703125 -0.40625q0.703125 0 1.5625 0.15625l-0.25 1.46875q-0.515625 -0.09375 -0.984375 -0.09375q-0.765625 0 -1.078125 0.328125q-0.3125 0.3125 -0.3125 1.203125l0 0.90625l1.921875 0l0 1.3125l-1.921875 0l0 8.546875l-1.65625 0zm4.7614136 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.6033325 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281921 4.921875l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm19.442871 0l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0zm10.0217285 5.578125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm10.9435425 7.140625l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0zm9.460388 -4.375l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584167 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.9626465 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#d9ead3" d="m467.042 484.1076l154.07874 -74.80313l154.07874 74.80313l-154.07874 74.80316z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m467.042 484.1076l154.07874 -74.80313l154.07874 74.80313l-154.07874 74.80316z" fill-rule="nonzero"></path><path fill="#000000" d="m553.94073 486.65262l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584229 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438171 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.328125 0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.015625 -8.75l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.5042114 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm22.309021 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.000732 5.875l3.59375 -5.125l-3.328125 -4.734375l2.09375 0l1.515625 2.3125q0.421875 0.65625 0.671875 1.109375q0.421875 -0.609375 0.765625 -1.09375l1.65625 -2.328125l1.984375 0l-3.390625 4.640625l3.65625 5.21875l-2.046875 0l-2.03125 -3.0625l-0.53125 -0.828125l-2.59375 3.890625l-2.015625 0zm10.453125 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.4572754 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm13.65625 1.4375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.8552246 -1.4375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm13.125 -0.40625q0 -0.34375 0 -0.5q0 -0.984375 0.265625 -1.703125q0.21875 -0.546875 0.671875 -1.09375q0.328125 -0.390625 1.1875 -1.15625q0.875 -0.765625 1.125 -1.21875q0.265625 -0.453125 0.265625 -1.0q0 -0.96875 -0.765625 -1.703125q-0.75 -0.734375 -1.859375 -0.734375q-1.0625 0 -1.78125 0.671875q-0.703125 0.65625 -0.9375 2.078125l-1.71875 -0.203125q0.234375 -1.90625 1.375 -2.90625q1.15625 -1.015625 3.03125 -1.015625q2.0 0 3.1875 1.09375q1.1875 1.078125 1.1875 2.609375q0 0.890625 -0.421875 1.640625q-0.40625 0.75 -1.625 1.828125q-0.8125 0.734375 -1.0625 1.078125q-0.25 0.34375 -0.375 0.796875q-0.125 0.4375 -0.140625 1.4375l-1.609375 0zm-0.09375 3.34375l0 -1.90625l1.890625 0l0 1.90625l-1.890625 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m618.7218 154.43832l1.1968384 48.0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m618.7218 154.43832l1.0472412 42.00186" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m618.11786 196.48135l1.7643433 4.495514l1.5380859 -4.5778503z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m896.65094 455.34122l2.3936768 43.653534" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m896.65094 455.34122l2.0651855 37.662506" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m897.06683 493.09418l1.8977661 4.440857l1.4007568 -4.621704z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m772.80054 281.8714l76.12598 1.669281" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m772.80054 281.8714l70.12744 1.5377502" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m842.8917 285.0605l4.573242 -1.5518494l-4.5007935 -1.750824z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m620.52234 360.3176l1.1968384 48.0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m620.52234 360.3176l1.0472412 42.00183" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m619.9184 402.36063l1.7643433 4.495514l1.5380859 -4.5778503z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m585.021 367.1076l58.80316 0l0 34.4252l-58.80316 0z" fill-rule="nonzero"></path><path fill="#000000" d="m595.4741 394.02762l0 -13.59375l1.84375 0l7.140625 10.671875l0 -10.671875l1.71875 0l0 13.59375l-1.84375 0l-7.140625 -10.6875l0 10.6875l-1.71875 0zm12.644836 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m788.84515 248.8924l58.80316 0l0 34.4252l-58.80316 0z" fill-rule="nonzero"></path><path fill="#000000" d="m803.142 275.81238l0 -5.765625l-5.234375 -7.828125l2.1875 0l2.671875 4.09375q0.75 1.15625 1.390625 2.296875q0.609375 -1.0625 1.484375 -2.40625l2.625 -3.984375l2.109375 0l-5.4375 7.828125l0 5.765625l-1.796875 0zm15.1466675 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375z" fill-rule="nonzero"></path><path fill="#d9ead3" d="m845.084 442.14172l156.34644 0l0 88.59845l-156.34644 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m845.084 442.14172l156.34644 0l0 88.59845l-156.34644 0z" fill-rule="nonzero"></path><path fill="#000000" d="m861.9121 477.0328l0 -1.609375l5.765625 0l0 5.046875q-1.328125 1.0625 -2.75 1.59375q-1.40625 0.53125 -2.890625 0.53125q-2.0 0 -3.640625 -0.859375q-1.625 -0.859375 -2.46875 -2.484375q-0.828125 -1.625 -0.828125 -3.625q0 -1.984375 0.828125 -3.703125q0.828125 -1.71875 2.390625 -2.546875q1.5625 -0.84375 3.59375 -0.84375q1.46875 0 2.65625 0.484375q1.203125 0.46875 1.875 1.328125q0.671875 0.84375 1.03125 2.21875l-1.625 0.4375q-0.3125 -1.03125 -0.765625 -1.625q-0.453125 -0.59375 -1.296875 -0.953125q-0.84375 -0.359375 -1.875 -0.359375q-1.234375 0 -2.140625 0.375q-0.890625 0.375 -1.453125 1.0q-0.546875 0.609375 -0.84375 1.34375q-0.53125 1.25 -0.53125 2.734375q0 1.8125 0.625 3.046875q0.640625 1.21875 1.828125 1.8125q1.203125 0.59375 2.546875 0.59375q1.171875 0 2.28125 -0.453125q1.109375 -0.453125 1.6875 -0.953125l0 -2.53125l-4.0 0zm14.683289 2.15625l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm12.766357 4.375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm6.694763 1.5l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.375 -1.984375q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.735107 4.921875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.9069214 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.6658325 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#000000" d="m855.74023 504.36093l0 -8.546875l-1.484375 0l0 -1.3125l1.484375 0l0 -1.046875q0 -0.984375 0.171875 -1.46875q0.234375 -0.65625 0.84375 -1.046875q0.609375 -0.40625 1.703125 -0.40625q0.703125 0 1.5625 0.15625l-0.25 1.46875q-0.515625 -0.09375 -0.984375 -0.09375q-0.765625 0 -1.078125 0.328125q-0.3125 0.3125 -0.3125 1.203125l0 0.90625l1.921875 0l0 1.3125l-1.921875 0l0 8.546875l-1.65625 0zm4.7614136 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.6033325 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm19.44281 0l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0zm10.0217285 5.578125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm10.9435425 7.140625l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0zm9.460388 -4.375l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584167 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.9627075 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094421 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m768.958 484.1076l76.12598 1.6693115" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m768.958 484.1076l70.12744 1.5377808" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m839.0492 487.2967l4.573242 -1.5518494l-4.5007935 -1.750824z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m785.0026 451.1286l58.80316 0l0 34.4252l-58.80316 0z" fill-rule="nonzero"></path><path fill="#000000" d="m799.2995 478.0486l0 -5.765625l-5.234375 -7.828125l2.1875 0l2.671875 4.09375q0.75 1.15625 1.390625 2.296875q0.609375 -1.0625 1.484375 -2.40625l2.625 -3.984375l2.109375 0l-5.4375 7.828125l0 5.765625l-1.796875 0zm15.1467285 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438171 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m1093.5826 486.44095l3.4645996 -377.88977" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1093.5826 486.44095l3.4645996 -377.88977" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m1005.27295 284.2047l89.60632 1.6378174" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1005.27295 284.2047l83.6073 1.5281677" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m1088.8501 287.38434l4.567505 -1.5685425l-4.507202 -1.734375z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m1099.9213 111.42519l-391.55908 -2.8661423" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1099.9213 111.42519l-385.5592 -2.8222198" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m714.37415 106.95129l-4.550049 1.6184692l4.525879 1.684906z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m1001.4304 485.62204l89.60632 1.6378174" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1001.4304 485.62204l83.6073 1.5281372" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m1085.0076 488.80167l4.567505 -1.5685425l-4.50708 -1.734375z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m621.1207 558.91077l0.12597656 76.81891" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m621.1207 558.91077l0.1161499 70.81891" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m619.58514 629.73236l1.6591797 4.5354004l1.6442871 -4.5408325z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m579.0289 573.6352l47.338562 0l0 34.42517l-47.338562 0z" fill-rule="nonzero"></path><path fill="#000000" d="m589.482 600.5552l0 -13.59375l1.84375 0l7.140625 10.671875l0 -10.671875l1.71875 0l0 13.59375l-1.84375 0l-7.140625 -10.6875l0 10.6875l-1.71875 0zm12.644836 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125z" fill-rule="nonzero"></path><path fill="#ead1dc" d="m545.084 634.39105l156.34644 0l0 70.26776l-156.34644 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m545.084 634.39105l156.34644 0l0 70.26776l-156.34644 0z" fill-rule="nonzero"></path><path fill="#000000" d="m557.92773 654.44495l-3.609375 -13.59375l1.84375 0l2.0625 8.90625q0.34375 1.40625 0.578125 2.78125q0.515625 -2.171875 0.609375 -2.515625l2.59375 -9.171875l2.171875 0l1.953125 6.875q0.734375 2.5625 1.046875 4.8125q0.265625 -1.28125 0.6875 -2.953125l2.125 -8.734375l1.8125 0l-3.734375 13.59375l-1.734375 0l-2.859375 -10.359375q-0.359375 -1.296875 -0.421875 -1.59375q-0.21875 0.9375 -0.40625 1.59375l-2.890625 10.359375l-1.828125 0zm21.764893 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.078857 5.875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.613586 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.265625 -1.3125q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm22.290771 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm14.293396 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.297607 3.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.7819824 5.75l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047546 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#000000" d="m557.1621 676.44495l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.660461 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm7.7854614 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270386 1.5l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm19.215271 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm7.9645386 0.28125q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.9313965 0.8125l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047607 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm12.766357 4.375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125z" fill-rule="nonzero"></path><path fill="#000000" d="m554.05273 698.44495l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0zm10.0217285 5.578125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm10.9435425 7.140625l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0zm8.601013 0.234375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm11.585327 -0.234375l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm3.5510864 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm8.985107 5.734375l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.313171 -6.578125l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.1292114 0l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m603.2966 782.2992l2.3937378 43.653564" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m603.2966 782.2992l2.0652466 37.662598" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m603.7125 820.0522l1.8977051 4.440857l1.4008179 -4.621704z" fill-rule="evenodd"></path><path fill="#bf9000" d="m512.5171 813.52496l114.74011 -60.960632l114.74017 60.960632l-114.74017 60.96057z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m512.5171 813.52496l114.74011 -60.960632l114.74017 60.960632l-114.74017 60.96057z" fill-rule="nonzero"></path><path fill="#000000" d="m605.663 816.06995l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm12.4436035 0l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm12.5060425 -2.25q0 -3.390625 1.8125 -5.296875q1.828125 -1.921875 4.703125 -1.921875q1.875 0 3.390625 0.90625q1.515625 0.890625 2.296875 2.5q0.796875 1.609375 0.796875 3.65625q0 2.0625 -0.84375 3.703125q-0.828125 1.625 -2.359375 2.46875q-1.53125 0.84375 -3.296875 0.84375q-1.921875 0 -3.4375 -0.921875q-1.5 -0.9375 -2.28125 -2.53125q-0.78125 -1.609375 -0.78125 -3.40625zm1.859375 0.03125q0 2.453125 1.3125 3.875q1.328125 1.40625 3.3125 1.40625q2.03125 0 3.34375 -1.421875q1.3125 -1.4375 1.3125 -4.0625q0 -1.65625 -0.5625 -2.890625q-0.546875 -1.234375 -1.640625 -1.921875q-1.078125 -0.6875 -2.421875 -0.6875q-1.90625 0 -3.28125 1.3125q-1.375 1.3125 -1.375 4.390625z" fill-rule="nonzero"></path><path fill="#f1c232" d="m677.6772 941.51184l179.27557 0l0 94.64563l-179.27557 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m677.6772 941.51184l179.27557 0l0 94.64563l-179.27557 0z" fill-rule="nonzero"></path><path fill="#000000" d="m725.6051 990.4265l0 -1.609375l5.765625 0l0 5.046875q-1.328125 1.0625 -2.75 1.59375q-1.40625 0.53125 -2.890625 0.53125q-2.0 0 -3.640625 -0.859375q-1.625 -0.859375 -2.46875 -2.484375q-0.828125 -1.625 -0.828125 -3.625q0 -1.984375 0.828125 -3.703125q0.828125 -1.71875 2.390625 -2.546875q1.5625 -0.84375 3.59375 -0.84375q1.46875 0 2.65625 0.484375q1.203125 0.46875 1.875 1.328125q0.671875 0.84375 1.03125 2.21875l-1.625 0.4375q-0.3125 -1.03125 -0.765625 -1.625q-0.453125 -0.59375 -1.296875 -0.953125q-0.84375 -0.359375 -1.875 -0.359375q-1.234375 0 -2.140625 0.375q-0.890625 0.375 -1.453125 1.0q-0.546875 0.609375 -0.84375 1.34375q-0.53125 1.25 -0.53125 2.734375q0 1.8125 0.625 3.046875q0.640625 1.21875 1.828125 1.8125q1.203125 0.59375 2.546875 0.59375q1.171875 0 2.28125 -0.453125q1.109375 -0.453125 1.6875 -0.953125l0 -2.53125l-4.0 0zm7.9332886 5.328125l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm21.978333 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0944824 -6.75l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.0979004 0l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm15.796875 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.531982 4.9375l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm7.5788574 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270386 1.5l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#ffd966" d="m400.60892 941.51184l179.2756 0l0 94.64563l-179.2756 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m400.60892 941.51184l179.2756 0l0 94.64563l-179.2756 0z" fill-rule="nonzero"></path><path fill="#000000" d="m422.49536 995.75464l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.250702 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm16.75 -0.234375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.228302 0l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813202 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm22.290802 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm13.043396 6.109375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm11.616577 3.546875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.188232 1.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm11.828125 2.9375l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm18.035461 0l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m627.2572 874.48553l0 33.513184l-137.00787 0l0 33.510498" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m627.2572 874.48553l0 33.513123l-137.00787 0l0 30.083435" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m490.24933 938.0821l-1.1245728 -1.1245728l1.1245728 3.0897827l1.1246033 -3.0897827z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m627.2572 874.48553l0 33.513184l140.06299 0l0 33.510498" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m627.2572 874.48553l0 33.513123l140.06299 0l0 30.083435" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m767.3202 938.0821l-1.1245728 -1.1245728l1.1245728 3.0897827l1.1245728 -3.0897827z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m733.7454 1068.1392l137.00787 0l0 48.0l-137.00787 0z" fill-rule="nonzero"></path><path fill="#000000" d="m742.7142 1095.0591l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0zm16.256042 5.578125l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm7.5788574 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270386 1.5l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm19.215271 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.9020386 -3.421875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.297607 4.921875l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m1027.8976 907.0079l229.48035 0l0 94.64569l-229.48035 0z" fill-rule="nonzero"></path><path fill="#000000" d="m1038.3976 933.92786l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm18.176147 4.421875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm9.281982 -6.765625l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.1135254 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9782715 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547607 2.265625l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm6.546875 2.109375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm10.366577 0l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.9020996 -3.421875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm13.18396 4.921875l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0zm10.0217285 5.578125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm10.9436035 7.140625l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0z" fill-rule="nonzero"></path><path fill="#000000" d="m1037.757 951.55286l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584229 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.9626465 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm18.423096 0l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.6604 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm7.7854004 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270996 1.5l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" d="m1037.757 973.55286l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm12.4436035 0l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm12.5061035 -2.25q0 -3.390625 1.8125 -5.296875q1.828125 -1.921875 4.703125 -1.921875q1.875 0 3.390625 0.90625q1.515625 0.890625 2.296875 2.5q0.796875 1.609375 0.796875 3.65625q0 2.0625 -0.84375 3.703125q-0.828125 1.625 -2.359375 2.46875q-1.53125 0.84375 -3.296875 0.84375q-1.921875 0 -3.4375 -0.921875q-1.5 -0.9375 -2.28125 -2.53125q-0.78125 -1.609375 -0.78125 -3.40625zm1.859375 0.03125q0 2.453125 1.3125 3.875q1.328125 1.40625 3.3125 1.40625q2.03125 0 3.34375 -1.421875q1.3125 -1.4375 1.3125 -4.0625q0 -1.65625 -0.5625 -2.890625q-0.546875 -1.234375 -1.640625 -1.921875q-1.078125 -0.6875 -2.421875 -0.6875q-1.90625 0 -3.28125 1.3125q-1.375 1.3125 -1.375 4.390625zm21.819702 5.09375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.9020996 -3.421875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.297607 4.921875l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0z" fill-rule="nonzero"></path><path fill="#bf9000" d="m550.4829 1121.1864l156.3465 0l0 76.81885l-156.3465 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m550.4829 1121.1864l156.3465 0l0 76.81885l-156.3465 0z" fill-rule="nonzero"></path><path fill="#000000" d="m571.6152 1166.5157l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0zm11.058289 0l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm16.016357 1.75l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm14.031921 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5427246 -10.1875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.5354004 0l0 -8.546875l-1.484375 0l0 -1.3125l1.484375 0l0 -1.046875q0 -0.984375 0.171875 -1.46875q0.234375 -0.65625 0.84375 -1.046875q0.609375 -0.40625 1.703125 -0.40625q0.703125 0 1.5625 0.15625l-0.25 1.46875q-0.515625 -0.09375 -0.984375 -0.09375q-0.765625 0 -1.078125 0.328125q-0.3125 0.3125 -0.3125 1.203125l0 0.90625l1.921875 0l0 1.3125l-1.921875 0l0 8.546875l-1.65625 0zm4.6989746 3.796875l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm21.042664 -3.796875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.2507324 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm16.75 -0.234375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094421 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m490.2467 1036.1575l0 42.51465l138.42523 0l0 42.52478" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m490.2467 1036.1575l0 42.51465l138.42523 0l0 39.097656" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m628.67194 1117.7698l-1.1246338 -1.1246338l1.1246338 3.0898438l1.1245728 -3.0898438z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m767.31494 1036.1575l0 42.51465l-138.64563 0l0 42.52478" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m767.31494 1036.1575l0 42.51465l-138.64563 0l0 39.097656" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m628.6693 1117.7698l-1.1246338 -1.1246338l1.1246338 3.0898438l1.1245728 -3.0898438z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m623.2572 704.6588l4.0 47.905518" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m623.2572 704.6588l3.5007324 41.92633" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m625.11194 746.72253l2.0236206 4.3849487l1.2684326 -4.65979z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m628.6562 1198.0052l0 25.002075l385.45148 0l0 -553.4745l-312.66412 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m628.6562 1198.0052l0 25.002075l385.45148 0l0 -553.4745l-309.237 0" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m704.87067 669.53284l1.1245728 -1.1246338l-3.0897827 1.1246338l3.0897827 1.1245728z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m701.4305 651.92975l522.5573 3.0775146l0 -581.44293l-519.1407 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m701.4304 651.92975l522.5575 3.0775146l0 -581.44293l-515.71375 0" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m708.2742 73.56431l1.1246338 -1.124588l-3.0897827 1.124588l3.0897827 1.1245804z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m808.0315 611.3517l466.8661 0l0 43.653564l-466.8661 0z" fill-rule="nonzero"></path><path fill="#000000" d="m818.5315 638.2717l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm18.176086 4.421875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.500732 5.875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm9.281921 -6.765625l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm4.1135864 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.9783325 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm15.547546 2.265625l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm6.546875 2.109375l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm10.366638 0l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.9020386 -3.421875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm13.215271 5.15625l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm8.261414 -0.234375l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm18.394836 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.078857 5.875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.613586 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.265625 -1.3125q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281921 4.921875l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm22.290833 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm14.293396 9.65625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.297607 3.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.7819214 5.75l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.62506104 -0.453125 0.85943604 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.093811 1.296875 -2.718811 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875061 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015686 0.5625 -2.500061 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921936 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.79693604 -0.921875 -1.921936 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047668 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm16.12146 5.875l-3.015625 -9.859375l1.71875 0l1.5625 5.6875l0.59375 2.125q0.03125 -0.15625 0.5 -2.03125l1.578125 -5.78125l1.71875 0l1.46875 5.71875l0.484375 1.890625l0.578125 -1.90625l1.6875 -5.703125l1.625 0l-3.078125 9.859375l-1.734375 0l-1.578125 -5.90625l-0.375 -1.671875l-2.0 7.578125l-1.734375 0zm11.6604 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm7.7855225 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm1.5270996 1.5l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm14.887085 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm16.75 -0.234375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.328125 0l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.015625 -8.75l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.5042725 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.281982 4.921875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm19.21521 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125zm0.9020996 -3.421875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.297607 4.921875l0 -13.59375l1.671875 0l0 7.75l3.953125 -4.015625l2.15625 0l-3.765625 3.65625l4.140625 6.203125l-2.0625 0l-3.25 -5.03125l-1.171875 1.125l0 3.90625l-1.671875 0zm16.0625 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m767.6221 103.74803l179.27557 0l0 43.65355l-179.27557 0z" fill-rule="nonzero"></path><path fill="#000000" d="m778.1221 130.66803l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm18.176025 4.421875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438232 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.375 -1.984375q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.735107 4.921875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.9069824 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.6657715 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm13.590271 2.015625l1.625 -0.21875q0.0625 1.546875 0.578125 2.125q0.53125 0.578125 1.4375 0.578125q0.6875 0 1.171875 -0.3125q0.5 -0.3125 0.671875 -0.84375q0.1875 -0.53125 0.1875 -1.703125l0 -9.359375l1.8125 0l0 9.265625q0 1.703125 -0.421875 2.640625q-0.40625 0.9375 -1.3125 1.4375q-0.890625 0.484375 -2.09375 0.484375q-1.796875 0 -2.75 -1.03125q-0.9375 -1.03125 -0.90625 -3.0625zm9.640625 -0.515625l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm12.5061035 -2.25q0 -3.390625 1.8125 -5.296875q1.828125 -1.921875 4.703125 -1.921875q1.875 0 3.390625 0.90625q1.515625 0.890625 2.296875 2.5q0.796875 1.609375 0.796875 3.65625q0 2.0625 -0.84375 3.703125q-0.828125 1.625 -2.359375 2.46875q-1.53125 0.84375 -3.296875 0.84375q-1.921875 0 -3.4375 -0.921875q-1.5 -0.9375 -2.28125 -2.53125q-0.78125 -1.609375 -0.78125 -3.40625zm1.859375 0.03125q0 2.453125 1.3125 3.875q1.328125 1.40625 3.3125 1.40625q2.03125 0 3.34375 -1.421875q1.3125 -1.4375 1.3125 -4.0625q0 -1.65625 -0.5625 -2.890625q-0.546875 -1.234375 -1.640625 -1.921875q-1.078125 -0.6875 -2.421875 -0.6875q-1.90625 0 -3.28125 1.3125q-1.375 1.3125 -1.375 4.390625zm13.183289 6.59375l0 -13.59375l1.84375 0l7.140625 10.671875l0 -10.671875l1.71875 0l0 13.59375l-1.84375 0l-7.140625 -10.6875l0 10.6875l-1.71875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m529.084 131.11548l-343.0866 -1.102356" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m529.084 131.11548l-337.08667 -1.0830841" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m192.00266 128.38068l-4.5433807 1.637146l4.5327606 1.6663055z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m258.7034 136.56955l156.34647 0l0 70.267715l-156.34647 0z" fill-rule="nonzero"></path><path fill="#000000" d="m269.17215 163.48955l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm16.865448 5.921875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0632324 4.9375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm5.556427 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm16.75 -0.234375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm13.012146 5.875l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0zm10.021698 5.578125l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm10.943573 7.140625l0 -13.59375l1.8125 0l0 13.59375l-1.8125 0zm9.835358 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.978302 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438202 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 6.71875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625z" fill-rule="nonzero"></path><path fill="#000000" d="m276.73465 183.88017q-0.828125 0.921875 -1.8125 1.390625q-0.96875 0.453125 -2.09375 0.453125q-2.09375 0 -3.3125 -1.40625q-1.0 -1.15625 -1.0 -2.578125q0 -1.265625 0.8125 -2.28125q0.8125 -1.015625 2.421875 -1.78125q-0.90625 -1.0625 -1.21875 -1.71875q-0.296875 -0.65625 -0.296875 -1.265625q0 -1.234375 0.953125 -2.125q0.953125 -0.90625 2.421875 -0.90625q1.390625 0 2.265625 0.859375q0.890625 0.84375 0.890625 2.046875q0 1.9375 -2.5625 3.3125l2.4375 3.09375q0.421875 -0.8125 0.640625 -1.890625l1.734375 0.375q-0.4375 1.78125 -1.203125 2.9375q0.9375 1.234375 2.125 2.078125l-1.125 1.328125q-1.0 -0.640625 -2.078125 -1.921875zm-3.40625 -7.078125q1.09375 -0.640625 1.40625 -1.125q0.328125 -0.484375 0.328125 -1.0625q0 -0.703125 -0.453125 -1.140625q-0.4375 -0.4375 -1.09375 -0.4375q-0.671875 0 -1.125 0.4375q-0.453125 0.421875 -0.453125 1.0625q0 0.3125 0.15625 0.65625q0.171875 0.34375 0.5 0.734375l0.734375 0.875zm2.359375 5.765625l-3.0625 -3.796875q-1.359375 0.8125 -1.84375 1.5q-0.46875 0.6875 -0.46875 1.375q0 0.8125 0.65625 1.703125q0.671875 0.890625 1.875 0.890625q0.75 0 1.546875 -0.46875q0.8125 -0.46875 1.296875 -1.203125zm17.283142 2.921875l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm9.281952 -6.765625l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm3.4573364 -2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm10.0 6.71875l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.828827 4.875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.613586 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.000702 8.734375l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125zm14.589569 -0.015625l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.297577 3.65625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm3.7819824 5.75l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm16.047577 1.9375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#ffffff" d="m94.25984 75.59843l0 0c0 -12.054596 10.597107 -21.826775 23.669289 -21.826775l0 0c13.072197 0 23.669289 9.772179 23.669289 21.826775l0 0c0 12.054588 -10.597092 21.826767 -23.669289 21.826767l0 0c-13.072182 0 -23.669289 -9.772179 -23.669289 -21.826767z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m94.25984 75.59843l0 0c0 -12.054596 10.597107 -21.826775 23.669289 -21.826775l0 0c13.072197 0 23.669289 9.772179 23.669289 21.826775l0 0c0 12.054588 -10.597092 21.826767 -23.669289 21.826767l0 0c-13.072182 0 -23.669289 -9.772179 -23.669289 -21.826767z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m117.92913 97.42519l1.1653595 119.55906" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m117.92913 97.42519l1.1653595 119.55906" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m117.92913 128.50131l29.574806 42.48819" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m117.92913 128.50131l29.574806 42.48819" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m91.50131 170.50131l26.425194 -41.07086" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m91.50131 170.50131l26.425194 -41.07086" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m235.77428 40.0l179.27559 0l0 48.0l-179.27559 0z" fill-rule="nonzero"></path><path fill="#000000" d="m273.33563 65.59187l0 -1.609375l5.765625 0l0 5.046875q-1.328125 1.0625 -2.75 1.59375q-1.40625 0.53125 -2.890625 0.53125q-2.0 0 -3.640625 -0.859375q-1.625 -0.859375 -2.46875 -2.484375q-0.828125 -1.625 -0.828125 -3.625q0 -1.984375 0.828125 -3.703125q0.828125 -1.71875 2.390625 -2.546875q1.5625 -0.84375 3.59375 -0.84375q1.46875 0 2.65625 0.484375q1.203125 0.46875 1.875 1.328125q0.671875 0.84375 1.03125 2.21875l-1.625 0.4375q-0.3125 -1.03125 -0.765625 -1.625q-0.453125 -0.59375 -1.296875 -0.953125q-0.84375 -0.359375 -1.875 -0.359375q-1.234375 0 -2.140625 0.375q-0.890625 0.375 -1.453125 1.0q-0.546875 0.609375 -0.84375 1.34375q-0.53125 1.25 -0.53125 2.734375q0 1.8125 0.625 3.046875q0.640625 1.21875 1.828125 1.8125q1.203125 0.59375 2.546875 0.59375q1.171875 0 2.28125 -0.453125q1.109375 -0.453125 1.6875 -0.953125l0 -2.53125l-4.0 0zm8.183289 5.328125l0 -13.59375l9.84375 0l0 1.59375l-8.046875 0l0 4.171875l7.53125 0l0 1.59375l-7.53125 0l0 4.625l8.359375 0l0 1.609375l-10.15625 0zm15.865448 0l0 -12.0l-4.46875 0l0 -1.59375l10.765625 0l0 1.59375l-4.5 0l0 12.0l-1.796875 0zm11.65741 0.234375l3.9375 -14.0625l1.34375 0l-3.9375 14.0625l-1.34375 0zm6.417694 -0.234375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.978302 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438202 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.375 -1.984375q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.735107 4.921875l0 -1.453125q-1.140625 1.671875 -3.125 1.671875q-0.859375 0 -1.625 -0.328125q-0.75 -0.34375 -1.125 -0.84375q-0.359375 -0.5 -0.515625 -1.234375q-0.09375 -0.5 -0.09375 -1.5625l0 -6.109375l1.671875 0l0 5.46875q0 1.3125 0.09375 1.765625q0.15625 0.65625 0.671875 1.03125q0.515625 0.375 1.265625 0.375q0.75 0 1.40625 -0.375q0.65625 -0.390625 0.921875 -1.046875q0.28125 -0.671875 0.28125 -1.9375l0 -5.28125l1.671875 0l0 9.859375l-1.5 0zm3.906952 0l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm12.665802 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m119.125984 215.50131l-38.58268 53.07086" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m119.125984 215.50131l-38.58268 53.07086" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m119.62467 215.50131l42.99212 58.992126" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m119.62467 215.50131l42.99212 58.992126" fill-rule="nonzero"></path></g></svg>
+
index c4dc92940ba3e09d448f5bf19217ee501b8f9413..26c7dde361482923a0ee9dc146cce90cd6871ba3 100644 (file)
@@ -1,9 +1,9 @@
 ---
 layout: default
 navsection: installguide
-title: Crunch v2 SLURM prerequisites
+title: Containers API SLURM prerequisites
 ...
 
-Crunch v2 containers can be dispatched to a SLURM cluster.  The dispatcher sends work to the cluster using SLURM's @sbatch@ command, so it works in a variety of SLURM configurations.
+Containers can be dispatched to a SLURM cluster.  The dispatcher sends work to the cluster using SLURM's @sbatch@ command, so it works in a variety of SLURM configurations.
 
 In order to run containers, you must run the dispatcher as a user that has permission to set up FUSE mounts and run Docker containers on each compute node.  This install guide refers to this user as the @crunch@ user.  We recommend you create this user on each compute node with the same UID and GID, and add it to the @fuse@ and @docker@ system groups to grant it the necessary permissions.  However, you can run the dispatcher under any account with sufficient permissions across the cluster.
index 5e373c38b855bb3b2f27410d94b0a6835da07c18..b28674de03cc8364d657ba957a9700e119da6732 100644 (file)
@@ -232,6 +232,7 @@ On Red Hat-based systems:
 
 <notextile>
 <pre><code>~$ <span class="userinput">sudo yum install git arvados-git-httpd</span>
+~$ <span class="userinput">sudo systemctl enable arvados-git-httpd</span>
 </code></pre>
 </notextile>
 
@@ -239,10 +240,9 @@ Verify that @arvados-git-httpd@ and @git-http-backend@ can be run:
 
 <notextile>
 <pre><code>~$ <span class="userinput">arvados-git-httpd -h</span>
-Usage of arvados-git-httpd:
-  -address="0.0.0.0:80": Address to listen on, "host:port".
-  -git-command="/usr/bin/git": Path to git executable. Each authenticated request will execute this program with a single argument, "http-backend".
-  -repo-root="/path/to/cwd": Path to git repositories.
+[...]
+Usage: arvados-git-httpd [-config path/to/arvados/git-httpd.yml]
+[...]
 ~$ <span class="userinput">git http-backend</span>
 Status: 500 Internal Server Error
 Expires: Fri, 01 Jan 1980 00:00:00 GMT
@@ -255,43 +255,29 @@ fatal: No REQUEST_METHOD from server
 
 h3. Enable arvados-git-httpd
 
-Install runit to supervise the arvados-git-httpd daemon.  {% include 'install_runit' %}
+{% include 'notebox_begin' %}
+
+The arvados-git-httpd package includes configuration files for systemd.  If you're using a different init system, you'll need to configure a service to start and stop an @arvados-git-httpd@ process as desired.
+
+{% include 'notebox_end' %}
 
-Configure runit to run arvados-git-httpd, making sure to update the API host to match your site:
+Create the configuration file @/etc/arvados/git-httpd/git-httpd.yml@. Run @arvados-git-httpd -h@ to learn more about configuration entries.
 
 <notextile>
-<pre><code>~$ <span class="userinput">sudo mkdir -p /etc/sv</span>
-~$ <span class="userinput">cd /etc/sv</span>
-/etc/sv$ <span class="userinput">sudo mkdir arvados-git-httpd; cd arvados-git-httpd</span>
-/etc/sv/arvados-git-httpd$ <span class="userinput">sudo mkdir log</span>
-/etc/sv/arvados-git-httpd$ <span class="userinput">sudo sh -c 'cat &gt;log/run' &lt;&lt;'EOF'
-#!/bin/sh
-mkdir -p main
-chown git:git main
-exec chpst -u git:git svlogd -tt main
-EOF</span>
-/etc/sv/arvados-git-httpd$ <span class="userinput">sudo sh -c 'cat &gt;run' &lt;&lt;'EOF'
-#!/bin/sh
-export ARVADOS_API_HOST=<b>uuid_prefix.your.domain</b>
-export GITOLITE_HTTP_HOME=/var/lib/arvados/git
-export GL_BYPASS_ACCESS_CHECKS=1
-export PATH="$PATH:/var/lib/arvados/git/bin"
-exec chpst -u git:git arvados-git-httpd -address=:9001 -git-command=/var/lib/arvados/git/gitolite/src/gitolite-shell -repo-root=<b>/var/lib/arvados/git</b>/repositories 2&gt;&1
-EOF</span>
-/etc/sv/arvados-git-httpd$ <span class="userinput">sudo chmod +x run log/run</span>
-/etc/sv/arvados-git-httpd$ <span class="userinput">sudo ln -s "$(pwd)" /etc/service/</span>
+<pre><code>Client:
+  APIHost: <b>uuid_prefix.your.domain</b>
+  Insecure: false
+GitCommand: /var/lib/arvados/git/gitolite/src/gitolite-shell
+GitoliteHome: /var/lib/arvados/git
+Listen: :9001
+RepoRoot: /var/lib/arvados/git/repositories
 </code></pre>
 </notextile>
 
-If you are using a different daemon supervisor, or if you want to test the daemon in a terminal window, an equivalent shell command to run arvados-git-httpd is:
+Restart the systemd service to ensure the new configuration is used.
 
 <notextile>
-<pre><code>sudo -u git \
-  ARVADOS_API_HOST=<span class="userinput">uuid_prefix.your.domain</span> \
-  GITOLITE_HTTP_HOME=/var/lib/arvados/git \
-  GL_BYPASS_ACCESS_CHECKS=1 \
-  PATH="$PATH:/var/lib/arvados/git/bin" \
-  arvados-git-httpd -address=:9001 -git-command=/var/lib/arvados/git/gitolite/src/gitolite-shell -repo-root=/var/lib/arvados/git/repositories 2&gt;&1
+<pre><code>~$ <span class="userinput">sudo systemctl restart arvados-git-httpd</span>
 </code></pre>
 </notextile>
 
index 16d23e6df56d2fb58cf38974a1e31dbda82d8915..f1c38ea4826394c3b77474c1787a23be6514b476 100644 (file)
@@ -51,7 +51,7 @@ Usage of keep-web:
 </code></pre>
 </notextile>
 
-{% assign railscmd = "bundle exec ./script/get_anonymous_user_token.rb" %}
+{% assign railscmd = "bundle exec ./script/get_anonymous_user_token.rb --get" %}
 {% assign railsout = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" %}
 If you intend to use Keep-web to serve public data to anonymous clients, configure it with an anonymous token. You can use the same one you used when you set up your Keepproxy server, or use the following command on the <strong>API server</strong> to create another. {% include 'install_rails_command' %}
 
index a6bb5d4bd9aeb3a6d2b276d20e1fc1e0505bf2c9..f1a2688014b54fc3da1db8309b231e766bbccfa8 100644 (file)
@@ -51,7 +51,7 @@ Usage of keepproxy:
 
 h3. Create an API token for the Keepproxy server
 
-{% assign railscmd = "bundle exec ./script/get_anonymous_user_token.rb" %}
+{% assign railscmd = "bundle exec ./script/get_anonymous_user_token.rb --get" %}
 {% assign railsout = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" %}
 The Keepproxy server needs a token to talk to the API server.  On the <strong>API server</strong>, use the following command to create the token.  {% include 'install_rails_command' %}
 
index 8cde514f68f769a7ab336bb606f0e1ff8743b0c4..4776a97895553efcde7b71f38197d56f6f56db7c 100644 (file)
@@ -3,7 +3,6 @@ layout: default
 navsection: sdk
 navmenu: CLI
 title: "Installation"
-
 ...
 
 Arvados CLI tools are written in Ruby and Python.  To use the @arv@ command, you can either install the @arvados-cli@ gem via RubyGems or build and install the package from source.  The @arv@ command also relies on other Arvados tools.  To get those, install the @arvados-python-client@ and @arvados-cwl-runner@ packages, either from PyPI or source.
diff --git a/doc/sdk/go/example.html.textile.liquid b/doc/sdk/go/example.html.textile.liquid
new file mode 100644 (file)
index 0000000..5fe202d
--- /dev/null
@@ -0,0 +1,76 @@
+---
+layout: default
+navsection: sdk
+navmenu: Python
+title: Examples
+...
+
+See "Arvados GoDoc":https://godoc.org/git.curoverse.com/arvados.git/sdk/go for detailed documentation.
+
+In these examples, the site prefix is @aaaaa@.
+
+h2.  Initialize SDK
+
+<pre>
+import (
+  "git.curoverse.com/arvados.git/sdk/go/arvados"
+  "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+}
+
+func main() {
+  arv, err := arvadosclient.MakeArvadosClient()
+  if err != nil {
+    log.Fatalf("Error setting up arvados client %s", err.Error())
+  }
+}
+</pre>
+
+h2. create
+
+<pre>
+  var collection arvados.Collection
+  err := api.Create("collections", Dict{"collection": Dict{"name": "create example"}}, &collection)
+</pre>
+
+h2. delete
+
+<pre>
+  var collection arvados.Collection
+  err := api.Delete("collections", "aaaaa-4zz18-ccccccccccccccc", Dict{}, &collection)
+</pre>
+
+h2. get
+
+<pre>
+  var collection arvados.Collection
+  err := api.Get("collections", "aaaaa-4zz18-ccccccccccccccc", Dict{}, &collection)
+</pre>
+
+h2. list
+
+<pre>
+  var collection arvados.Collection
+  err := api.List("collections", Dict{}, &collection)
+</pre>
+
+h2. update
+
+<pre>
+  var collection arvados.Collection
+  err := api.Update("collections", "aaaaa-4zz18-ccccccccccccccc", Dict{"collection": Dict{"name": "update example"}}, &collection)
+</pre>
+
+h2. Get current user
+
+<pre>
+  var user arvados.User
+  err := api.Get("users", "current", Dict{}, &user)
+</pre>
+
+h2. Example program
+
+You can save this source as a .go file and run it:
+
+<notextile>{% code 'example_sdk_go' as go %}</notextile>
+
+A few more usage examples can be found in the "services/keepproxy":https://dev.arvados.org/projects/arvados/repository/revisions/master/show/services/keepproxy and "sdk/go/keepclient":https://dev.arvados.org/projects/arvados/repository/revisions/master/show/sdk/go/keepclient directories in the arvados source tree.
index 24873318da20dea0eaa2582706c7fb03c37ad6e7..81f4f9914bf69290760a60e2db847f3ec0a40a95 100644 (file)
@@ -2,24 +2,17 @@
 layout: default
 navsection: sdk
 navmenu: Go
-title: "Go SDK"
-
+title: "Installation"
 ...
 
 The Go ("Golang":http://golang.org) SDK provides a generic set of wrappers so you can make API calls easily.
 
+See "Arvados GoDoc":https://godoc.org/git.curoverse.com/arvados.git/sdk/go for detailed documentation.
+
 h3. Installation
 
-You don't need to install anything. Just import the client like this. The go tools will fetch the relevant code and dependencies for you.
+Use @go get git.curoverse.com/arvados.git/sdk/go/arvadosclient@.  The go tools will fetch the relevant code and dependencies for you.
 
 <notextile>{% code 'example_sdk_go_imports' as go %}</notextile>
 
 If you need pre-release client code, you can use the latest version from the repo by following "these instructions.":https://dev.arvados.org/projects/arvados/wiki/Go#Using-Go-with-Arvados
-
-h3. Example
-
-You can save this source as a .go file and run it:
-
-<notextile>{% code 'example_sdk_go' as go %}</notextile>
-
-A few more usage examples can be found in the "services/keepproxy":https://dev.arvados.org/projects/arvados/repository/revisions/master/show/services/keepproxy and "sdk/go/keepclient":https://dev.arvados.org/projects/arvados/repository/revisions/master/show/sdk/go/keepclient directories in the arvados source tree.
index db5d6f13b0cbdc08c62f1f156ca70bafdd23e88b..7633228995ba29a199716ec2b983b66e1892583c 100644 (file)
@@ -1,19 +1,16 @@
 ---
 layout: default
 navsection: sdk
-title: "Arvados SDK Reference"
+title: "SDK Reference"
 ...
 
-This section documents how to access the Arvados API and Keep using various programming languages.
+This section documents language bindings for the "Arvados API":{{site.baseurl}}/api and Keep that are available for various programming languages.  Not all features are available in every SDK.  The most complete SDK is the Python SDK.  Note that this section only gives a high level overview of each SDK.  Consult the "Arvados API":{{site.baseurl}}/api section for detailed documentation about Arvados API calls available on each resource.
 
 * "Python SDK":{{site.baseurl}}/sdk/python/sdk-python.html
+* "Command line SDK":{{site.baseurl}}/sdk/cli/install.html ("arv")
+* "Go SDK":{{site.baseurl}}/sdk/go/index.html
 * "Perl SDK":{{site.baseurl}}/sdk/perl/index.html
 * "Ruby SDK":{{site.baseurl}}/sdk/ruby/index.html
 * "Java SDK":{{site.baseurl}}/sdk/java/index.html
-* "Go SDK":{{site.baseurl}}/sdk/go/index.html
-* "Command line SDK":{{site.baseurl}}/sdk/cli/index.html ("arv")
-
-SDKs not yet implemented:
 
-* Rails SDK: Workbench uses an ActiveRecord-like interface to Arvados. This hasn't yet been extracted from Workbench and packaged as a gem.
-* R: We plan to support this, but it has not been implemented yet.
+Many Arvados Workbench pages, under the the *Advanced* tab, provide examples of API and SDK use for accessing the current resource .
diff --git a/doc/sdk/java/example.html.textile.liquid b/doc/sdk/java/example.html.textile.liquid
new file mode 100644 (file)
index 0000000..9ff848b
--- /dev/null
@@ -0,0 +1,78 @@
+---
+layout: default
+navsection: sdk
+navmenu: Java
+title: "Examples"
+...
+
+h2. Initialize SDK
+
+<pre>
+import org.arvados.sdk.Arvados;
+</pre>
+
+<pre>
+    String apiName = "arvados";
+    String apiVersion = "v1";
+
+    Arvados arv = new Arvados(apiName, apiVersion);
+</pre>
+
+h2. create
+
+<pre>
+    Map<String, String> collection = new HashMap<String, String>();
+    collection.put("name", "create example");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put("collection", collection);
+    Map response = arv.call("collections", "create", params);
+</pre>
+
+h2. delete
+
+<pre>
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
+    Map response = arv.call("collections", "delete", params);
+</pre>
+
+h2. get
+
+<pre>
+    params = new HashMap<String, Object>();
+    params.put("uuid", userUuid);
+    Map response = arv.call("users", "get", params);
+</pre>
+
+h2. list
+
+<pre>
+    Map<String, Object> params = new HashMap<String, Object>();
+    Map response = arv.call("users", "list", params);
+
+    // get uuid of the first user from the response
+    List items = (List)response.get("items");
+
+    Map firstUser = (Map)items.get(0);
+    String userUuid = (String)firstUser.get("uuid");
+</pre>
+
+h2. update
+
+<pre>
+    Map<String, String> collection = new HashMap<String, String>();
+    collection.put("name", "update example");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
+    params.put("collection", collection);
+    Map response = arv.call("collections", "update", params);
+</pre>
+
+h2. Get current user
+
+<pre>
+    Map<String, Object> params = new HashMap<String, Object>();
+    Map response = arv.call("users", "current", params);
+</pre>
index 48f72d3a7dedf35c48ff219ba29a1a59b17fc4f1..27984b2fe427404e872ac394813d6e1ee218eef2 100644 (file)
@@ -2,8 +2,7 @@
 layout: default
 navsection: sdk
 navmenu: Java
-title: "Java SDK"
-
+title: "Installation"
 ...
 
 The Java SDK provides a generic set of wrappers so you can make API calls in java.
@@ -11,10 +10,10 @@ The Java SDK provides a generic set of wrappers so you can make API calls in jav
 h3. Introdution
 
 * The Java SDK requires Java 6 or later
-  
+
 * The Java SDK is implemented as a maven project. Hence, you would need a working
 maven environment to be able to build the source code. If you do not have maven setup,
-you may find the "Maven in 5 Minutes":http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html link useful. 
+you may find the "Maven in 5 Minutes":http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html link useful.
 
 * In this document $ARVADOS_HOME is used to refer to the directory where
 arvados code is cloned in your system. For ex: $ARVADOS_HOME = $HOME/arvados
@@ -38,7 +37,7 @@ ARVADOS_API_HOST_INSECURE: Set this to true if you are using self-signed
 </notextile>
 
 * Please see "api-tokens":{{site.baseurl}}/user/reference/api-tokens.html for full details.
-         
+
 
 h3. Building the Arvados SDK
 
@@ -124,7 +123,7 @@ The local repository is usually located in your home directory at <code class="u
 <pre>
 In Eclipse IDE:
 Window -> Preferences -> Java -> Build Path -> Classpath Variables
-    Click on the "New..." button and add a new 
+    Click on the "New..." button and add a new
     M2_REPO variable and set it to your local Maven repository
 </pre>
 </notextile>
diff --git a/doc/sdk/perl/example.html.textile.liquid b/doc/sdk/perl/example.html.textile.liquid
new file mode 100644 (file)
index 0000000..980129c
--- /dev/null
@@ -0,0 +1,81 @@
+---
+layout: default
+navsection: sdk
+navmenu: Perl
+title: "Examples"
+...
+
+h2. Initialize SDK
+
+Set up an API client user agent:
+
+<notextile>
+<pre><code class="userinput">
+use Arvados;
+my $arv = Arvados->new('apiVersion' => 'v1');
+</code></pre>
+</notextile>
+
+The SDK retrieves the list of API methods from the server at run time. Therefore, the set of available methods is determined by the server version rather than the SDK version.
+
+h2. create
+
+Create an object:
+
+<notextile>
+<pre><code class="userinput">my $test_link = $arv->{'links'}->{'create'}->execute('link' => { 'link_class' => 'test', 'name' => 'test' });
+</code></pre>
+</notextile>
+
+h2. delete
+
+<notextile>
+<pre><code class="userinput">my $some_user = $arv->{'collections'}->{'get'}->execute('uuid' => $collection_uuid);
+</code></pre>
+</notextile>
+
+h2. get
+
+Retrieve an object by ID:
+
+<notextile>
+<pre><code class="userinput">my $some_user = $arv->{'users'}->{'get'}->execute('uuid' => $current_user_uuid);
+</code></pre>
+</notextile>
+
+Get the UUID of an object that was retrieved using the SDK:
+
+<notextile>
+<pre><code class="userinput">my $current_user_uuid = $current_user->{'uuid'}
+</code></pre>
+</notextile>
+
+h2. list
+
+Get a list of objects:
+
+<notextile>
+<pre><code class="userinput">my $repos = $arv->{'repositories'}->{'list'}->execute;
+print ("UUID of first repo returned is ", $repos->{'items'}->[0], "\n");
+</code></pre>
+</notextile>
+
+h2. update
+
+Update an object:
+
+<notextile>
+<pre><code class="userinput">my $test_link = $arv->{'links'}->{'update'}->execute(
+        'uuid' => $test_link->{'uuid'},
+        'link' => { 'properties' => { 'foo' => 'bar' } });
+</code></pre>
+</notextile>
+
+h2. Get current user
+
+Get the User object for the current user:
+
+<notextile>
+<pre><code class="userinput">my $current_user = $arv->{'users'}->{'current'}->execute;
+</code></pre>
+</notextile>
index e28d02011b8d559e7954bc7c5326a812c42b9adb..407008d1f76eebd6b12a6045551759004efa8b44 100644 (file)
@@ -2,8 +2,7 @@
 layout: default
 navsection: sdk
 navmenu: Perl
-title: "Perl SDK"
-
+title: "Installation"
 ...
 
 The Perl SDK provides a generic set of wrappers so you can make API calls easily.
@@ -63,59 +62,3 @@ EOF</code>
 arvados.v1.users.current.full_name = 'Your Name'
 </pre>
 </notextile>
-
-h3. Examples
-
-Set up an API client user agent:
-
-<notextile>
-<pre><code class="userinput">my $arv = Arvados->new('apiVersion' => 'v1');
-</code></pre>
-</notextile>
-
-Get the User object for the current user:
-
-<notextile>
-<pre><code class="userinput">my $current_user = $arv->{'users'}->{'current'}->execute;
-</code></pre>
-</notextile>
-
-Get the UUID of an object that was retrieved using the SDK:
-
-<notextile>
-<pre><code class="userinput">my $current_user_uuid = $current_user->{'uuid'}
-</code></pre>
-</notextile>
-
-Retrieve an object by ID:
-
-<notextile>
-<pre><code class="userinput">my $some_user = $arv->{'users'}->{'get'}->execute('uuid' => $current_user_uuid);
-</code></pre>
-</notextile>
-
-Create an object:
-
-<notextile>
-<pre><code class="userinput">my $test_link = $arv->{'links'}->{'create'}->execute('link' => { 'link_class' => 'test', 'name' => 'test' });
-</code></pre>
-</notextile>
-
-Update an object:
-
-<notextile>
-<pre><code class="userinput">my $test_link = $arv->{'links'}->{'update'}->execute(
-        'uuid' => $test_link->{'uuid'},
-        'link' => { 'properties' => { 'foo' => 'bar' } });
-</code></pre>
-</notextile>
-
-Get a list of objects:
-
-<notextile>
-<pre><code class="userinput">my $repos = $arv->{'repositories'}->{'list'}->execute;
-print ("UUID of first repo returned is ", $repos->{'items'}->[0], "\n");
-</code></pre>
-</notextile>
-
-The SDK retrieves the list of API methods from the server at run time. Therefore, the set of available methods is determined by the server version rather than the SDK version.
index 6afb9b51a3658efeffb984cb155efca7d37d3b82..0988a7ce9c4c6c05f990a36fd2d07d58662f6647 100644 (file)
@@ -5,7 +5,7 @@ navmenu: Python
 title: Subscribing to events
 ...
 
-Arvados applications can subscribe to a live event stream from the database.  Events are described in the "Log record schema.":{{site.baseurl}}/api/schema/Log.html
+Arvados applications can subscribe to a live event stream from the database.  Events are described in the "Log resource.":{{site.baseurl}}/api/methods/logs.html
 
 <notextile>
 {% code 'events_py' as python %}
diff --git a/doc/sdk/python/example.html.textile.liquid b/doc/sdk/python/example.html.textile.liquid
new file mode 100644 (file)
index 0000000..e91055e
--- /dev/null
@@ -0,0 +1,51 @@
+---
+layout: default
+navsection: sdk
+navmenu: Python
+title: Examples
+...
+
+In these examples, the site prefix is @aaaaa@.
+
+h2.  Initialize SDK
+
+<pre>
+import arvados
+api = arvados.api("v1")
+</pre>
+
+h2. create
+
+<pre>
+result = api.collection().create(body={"collection": {"name": "create example"}}).execute()
+</pre>
+
+h2. delete
+
+<pre>
+result = api.collections().delete(uuid="aaaaa-4zz18-ccccccccccccccc").execute()
+</pre>
+
+h2. get
+
+<pre>
+result = api.collections().get(uuid="aaaaa-4zz18-ccccccccccccccc").execute()
+</pre>
+
+h2. list
+
+<pre>
+result = api.collections().list(filters=[["uuid", "=", "aaaaa-bbbbb-ccccccccccccccc"]]).execute()
+</pre>
+
+h2. update
+
+<pre>
+result = api.collections().update(uuid="aaaaa-4zz18-ccccccccccccccc", body={"collection": {"name": "update example"}}).execute()
+</pre>
+
+h2. Get current user
+
+<pre>
+result = api.users().current().execute()
+</pre>
index 0b0f77d377e209afc7c0f2a7717f9a0360293a6d..e9b560a965d89e5cd2614efd25949ac405bc8620 100644 (file)
@@ -2,8 +2,7 @@
 layout: default
 navsection: sdk
 navmenu: Python
-title: "Python SDK"
-
+title: "Installation"
 ...
 
 The Python SDK provides access from Python to the Arvados API and Keep.  It also includes a number of command line tools for using and administering Arvados and Keep, and some conveniences for use in Crunch scripts; see "Crunch utility libraries":crunch-utility-libraries.html for details.
diff --git a/doc/sdk/ruby/example.html.textile.liquid b/doc/sdk/ruby/example.html.textile.liquid
new file mode 100644 (file)
index 0000000..409a70a
--- /dev/null
@@ -0,0 +1,75 @@
+---
+layout: default
+navsection: sdk
+navmenu: Python
+title: Examples
+...
+
+h2.  Initialize SDK
+
+Import the module and set up an API client user agent:
+
+<pre>
+require 'arvados'
+arv = Arvados.new(apiVersion: 'v1')
+</pre>
+
+The SDK retrieves the list of API methods from the server at run time. Therefore, the set of available methods is determined by the server version rather than the SDK version.
+
+h2. create
+
+Create an object:
+
+<pre>
+new_link = arv.link.create(link: {link_class: 'test', name: 'test'})
+</pre>
+
+h2. delete
+
+Delete an object:
+
+<pre>
+arv.link.delete(uuid: new_link[:uuid])
+</pre>
+
+h2. get
+
+Retrieve an object by ID:
+
+<pre>
+some_user = arv.user.get(uuid: current_user_uuid)
+</pre>
+
+h2. list
+
+Get a list of objects:
+
+<pre>
+repos = arv.repository.list
+first_repo = repos[:items][0]
+puts "UUID of first repo returned is #{first_repo[:uuid]}"</code>
+UUID of first repo returned is qr1hi-s0uqq-b1bnybpx3u5temz
+</pre>
+
+h2. update
+
+Update an object:
+
+<pre>
+updated_link = arv.link.update(uuid: new_link[:uuid],
+                               link: {properties: {foo: 'bar'}})
+</pre>
+
+h2. Get current user
+
+Get the User object for the current user:
+
+<pre>
+current_user = arv.user.current
+</pre>
+
+Get the UUID of an object that was retrieved using the SDK:
+
+<pre>
+current_user_uuid = current_user[:uuid]
+</pre>
index b78a37d03a8ff49c7bae98c303f9fa9b897b7e58..5ad02543ef95cce5f1e960e604f623bbd33a3503 100644 (file)
@@ -2,8 +2,7 @@
 layout: default
 navsection: sdk
 navmenu: Ruby
-title: "Ruby SDK"
-
+title: "Installation"
 ...
 
 The Ruby SDK provides a generic set of wrappers so you can make API calls easily.
@@ -52,74 +51,3 @@ EOF</code>
 arvados.v1.users.current.full_name = 'Your Name'
 </pre>
 </notextile>
-
-h3. Examples
-
-Import the module (we skipped this step above by using "ruby -r arvados"):
-
-<notextile>
-<pre><code class="userinput">require 'arvados'
-</code></pre>
-</notextile>
-
-Set up an API client user agent:
-
-<notextile>
-<pre><code class="userinput">arv = Arvados.new(apiVersion: 'v1')
-</code></pre>
-</notextile>
-
-Get the User object for the current user:
-
-<notextile>
-<pre><code class="userinput">current_user = arv.user.current
-</code></pre>
-</notextile>
-
-Get the UUID of an object that was retrieved using the SDK:
-
-<notextile>
-<pre><code class="userinput">current_user_uuid = current_user[:uuid]
-</code></pre>
-</notextile>
-
-Retrieve an object by ID:
-
-<notextile>
-<pre><code class="userinput">some_user = arv.user.get(uuid: current_user_uuid)
-</code></pre>
-</notextile>
-
-Create an object:
-
-<notextile>
-<pre><code class="userinput">new_link = arv.link.create(link: {link_class: 'test', name: 'test'})
-</code></pre>
-</notextile>
-
-Update an object:
-
-<notextile>
-<pre><code class="userinput">updated_link = arv.link.update(uuid: new_link[:uuid],
-                               link: {properties: {foo: 'bar'}})
-</code></pre>
-</notextile>
-
-Delete an object:
-
-<notextile>
-<pre><code class="userinput">arv.link.delete(uuid: new_link[:uuid])
-</code></pre>
-</notextile>
-
-Get a list of objects:
-
-<notextile>
-<pre><code class="userinput">repos = arv.repository.list
-first_repo = repos[:items][0]
-puts "UUID of first repo returned is #{first_repo[:uuid]}"</code>
-UUID of first repo returned is qr1hi-s0uqq-b1bnybpx3u5temz
-</pre>
-</notextile>
-
-The SDK retrieves the list of API methods from the server at run time. Therefore, the set of available methods is determined by the server version rather than the SDK version.
index c00f475ad9d0c43135b5b0f04db6569b7bb91aee..573e2b9b9eff6bde696312d0632a07821c5e22ef 100644 (file)
@@ -15,6 +15,7 @@ The @arvados-cwl-runner@ client is installed by default on Arvados shell nodes.
 <notextile>
 <pre><code>~$ <span class="userinput">virtualenv ~/venv</span>
 ~$ <span class="userinput">. ~/venv/bin/activate</span>
+~$ <span class="userinput">pip install -U setuptools</span>
 ~$ <span class="userinput">pip install arvados-cwl-runner</span>
 </code></pre>
 </notextile>
@@ -140,12 +141,12 @@ If you reference a file in "arv-mount":{{site.baseurl}}/user/tutorials/tutorial-
 
 If you reference a local file which is not in @arv-mount@, then @arvados-cwl-runner@ will upload the file to Keep and use the Keep URI reference from the upload.
 
-h2. Registering a workflow with Workbench
+h2. Registering a workflow to use in Workbench
 
-Use @--create-template@ to register a CWL workflow with Arvados Workbench.  This enables you to run workflows by clicking on the <span class="btn btn-sm btn-primary"><i class="fa fa-fw fa-gear"></i> Run a pipeline...</span> on the Workbench Dashboard.
+Use @--create-workflow@ to register a CWL workflow with Arvados.  This enables you to share workflows with other Arvados users, and run them by clicking the <span class="btn btn-sm btn-primary"><i class="fa fa-fw fa-gear"></i> Run a pipeline...</span> button on the Workbench Dashboard.
 
 <notextile>
-<pre><code>~/arvados/doc/user/cwl/bwa-mem$ <span class="userinput">arvados-cwl-runner --create-template bwa-mem.cwl</span>
+<pre><code>~/arvados/doc/user/cwl/bwa-mem$ <span class="userinput">arvados-cwl-runner --create-workflow bwa-mem.cwl</span>
 arvados-cwl-runner 1.0.20160628195002, arvados-python-client 0.1.20160616015107, cwltool 1.0.20160629140624
 2016-07-01 12:21:01 arvados.arv-run[15796] INFO: Upload local files: "bwa-mem.cwl"
 2016-07-01 12:21:01 arvados.arv-run[15796] INFO: Uploaded to qr1hi-4zz18-7e0hedrmkuyoei3
@@ -157,7 +158,7 @@ qr1hi-p5p6p-rjleou1dwr167v5
 You can provide a partial input file to set default values for the workflow input parameters:
 
 <notextile>
-<pre><code>~/arvados/doc/user/cwl/bwa-mem$ <span class="userinput">arvados-cwl-runner --create-template bwa-mem.cwl bwa-mem-template.yml</span>
+<pre><code>~/arvados/doc/user/cwl/bwa-mem$ <span class="userinput">arvados-cwl-runner --create-workflow bwa-mem.cwl bwa-mem-template.yml</span>
 arvados-cwl-runner 1.0.20160628195002, arvados-python-client 0.1.20160616015107, cwltool 1.0.20160629140624
 2016-07-01 14:09:50 arvados.arv-run[3730] INFO: Upload local files: "bwa-mem.cwl"
 2016-07-01 14:09:50 arvados.arv-run[3730] INFO: Uploaded to qr1hi-4zz18-0f91qkovk4ml18o
index f8f749c7cbdbfa97a5977d3a79dbe992abf3d373..643e6bb3df4ffa5db2a8d388b7c8b1412502cafa 100644 (file)
@@ -4,4 +4,4 @@ navsection: userguide
 title: "Pipeline template reference"
 ...
 
-Pipeline template options are described on the "pipeline template schema page.":{{site.baseurl}}/api/schema/PipelineTemplate.html
+Pipeline template options are described on the "pipeline template schema page.":{{site.baseurl}}/api/methods/pipeline_templates.html
index 8d1aca63057f44f22abb5811c2ef73c8478e4129..93fc2c0f34e4a3da4388560b265d7c189da30fa3 100644 (file)
@@ -4,6 +4,10 @@ navsection: userguide
 title: "Using arv-run"
 ...
 
+{% include 'crunch1only_begin' %}
+On those sites, the features described here are not yet implemented.
+{% include 'crunch1only_end' %}
+
 The @arv-run@ command enables you create Arvados pipelines at the command line that fan out to multiple concurrent tasks across Arvados compute nodes.
 
 {% include 'tutorial_expectations' %}
index 9a2e12c09677beb59495b95404caea2c8622be5a..14c88d1311194b1b576f94209a6dcbf56469d494 100644 (file)
@@ -4,6 +4,10 @@ navsection: userguide
 title: "Running an Arvados pipeline"
 ...
 
+{% include 'crunch1only_begin' %}
+If the Jobs API is not available, use the "Common Workflow Language":{{site.baseurl}}/user/cwl/cwl-runner.html instead.
+{% include 'crunch1only_end' %}
+
 This tutorial demonstrates how to use the command line to run the same pipeline as described in "running a pipeline using Workbench.":{{site.baseurl}}/user/tutorials/tutorial-pipeline-workbench.html
 
 {% include 'tutorial_expectations' %}
index ef4634ee742dd26a35ea3f39c5414c2bc383127f..a7682594c9f767bd9cf3d2ef21d466c31004d253 100644 (file)
@@ -22,7 +22,7 @@ This will open the template record in an interactive text editor (as specified b
 
 * @"name"@ is a human-readable name for the pipeline.
 * @"components"@ is a set of scripts or commands that make up the pipeline.  Each component is given an identifier (@"bwa-mem"@ and @"SortSam"@) in this example).
-** Each entry in components @"components"@ is an Arvados job submission.  For more information about individual jobs, see the "job object reference":{{site.baseurl}}/api/schema/Job.html and "job create method.":{{site.baseurl}}/api/methods/jobs.html#create
+** Each entry in components @"components"@ is an Arvados job submission.  For more information about individual jobs, see the "job resource reference.":{{site.baseurl}}/api/methods/jobs.html
 * @"repository"@, @"script_version"@, and @"script"@ indicate that we intend to use the external @"run-command"@ tool wrapper that is part of the Arvados.  These parameters are described in more detail in "Writing a script":tutorial-firstscript.html.
 * @"runtime_constraints"@ describes runtime resource requirements for the component.
 ** @"docker_image"@ specifies the "Docker":https://www.docker.com/ runtime environment in which to run the job.  The Docker image @"bcosc/arv-base-java"@ supplied here has the Java runtime environment, bwa, and samtools installed.
@@ -62,7 +62,7 @@ Test data is available in the "Arvados Tutorial":{{site.arvados_workbench_host}}
 * Choose <i class="fa fa-fw fa-archive"></i> "Tutorial chromosome 19 reference (2463fa9efeb75e099685528b3b9071e0+438)":{{site.arvados_workbench_host}}/collections/2463fa9efeb75e099685528b3b9071e0+438 for the "reference_collection" parameter
 * Choose <i class="fa fa-fw fa-archive"></i> "Tutorial sample exome (3229739b505d2b878b62aed09895a55a+142)":{{site.arvados_workbench_host}}/collections/3229739b505d2b878b62aed09895a55a+142 for the "sample" parameter
 
-For more information and examples for writing pipelines, see the "pipeline template reference":{{site.baseurl}}/api/schema/PipelineTemplate.html
+For more information and examples for writing pipelines, see the "pipeline template reference":{{site.baseurl}}/api/methods/pipeline_templates.html
 
 h2. Re-using your pipeline run
 
index fac573aca9bdbc30a1f93b8f75e4af10e0818cfe..6537fda0d85be61ca82892e00367a7df7f97f20d 100644 (file)
@@ -4,6 +4,10 @@ navsection: userguide
 title: "Running a pipeline using Workbench"
 ...
 
+{% include 'crunch1only_begin' %}
+On those sites, the details will be slightly different and the example pipeline might not be available.
+{% include 'crunch1only_end' %}
+
 A "pipeline" (sometimes called a "workflow" in other systems) is a sequence of steps that apply various programs or tools to transform input data to output data.  Pipelines are the principal means of performing computation with Arvados.  This tutorial demonstrates how to run a single-stage pipeline to take a small data set of paired-end reads from a sample "exome":https://en.wikipedia.org/wiki/Exome in "FASTQ":https://en.wikipedia.org/wiki/FASTQ_format format and align them to "Chromosome 19":https://en.wikipedia.org/wiki/Chromosome_19_%28human%29 using the "bwa mem":http://bio-bwa.sourceforge.net/ tool, producing a "Sequence Alignment/Map (SAM)":https://samtools.github.io/ file.  This tutorial will introduce the following Arvados features:
 
 <div>
index 47e8dc750cf0691e8f859468cbc433e50ea358de..d1556cfe028ab881b390d67ab50f05f55499426c 100644 (file)
@@ -81,10 +81,10 @@ In the editor, enter the following template:
 * @"repository"@ is the name of a git repository to search for the script version.  You can access a list of available git repositories on the Arvados Workbench in the *Repositories* page using the <span class="fa fa-lg fa-user"></span> <span class="caret"></span> top navigation menu icon.
 * @"script_version"@ specifies the version of the script that you wish to run.  This can be in the form of an explicit Git revision hash, a tag, or a branch (in which case it will use the HEAD of the specified branch).  Arvados logs the script version that was used in the run, enabling you to go back and re-run any past job with the guarantee that the exact same code will be used as was used in the previous run.
 * @"script"@ specifies the filename of the script to run.  Crunch expects to find this in the @crunch_scripts/@ subdirectory of the Git repository.
-* @"runtime_constraints"@ describes the runtime environment required to run the job.  These are described in the "job record schema":{{site.baseurl}}/api/schema/Job.html
+* @"runtime_constraints"@ describes the runtime environment required to run the job.  These are described in the "job record schema":{{site.baseurl}}/api/methods/jobs.html
 
 h2. Running your pipeline
 
 Your new pipeline template should appear at the top of the Workbench "pipeline&nbsp;templates":{{site.arvados_workbench_host}}/pipeline_templates page.  You can run your pipeline "using Workbench":tutorial-pipeline-workbench.html or the "command line.":{{site.baseurl}}/user/topics/running-pipeline-command-line.html
 
-For more information and examples for writing pipelines, see the "pipeline template reference":{{site.baseurl}}/api/schema/PipelineTemplate.html
+For more information and examples for writing pipelines, see the "pipeline template reference":{{site.baseurl}}/api/methods/pipeline_templates.html
index e1e7e87c5e53d0c297ec6d2e3ad0870890f402ff..9b1be1e74df9e36501ed0bd8def2d70cd7e1bfea 100644 (file)
@@ -8,10 +8,16 @@ ADD apt.arvados.org.list /etc/apt/sources.list.d/
 RUN apt-key adv --keyserver pool.sks-keyservers.net --recv 1078ECD7
 RUN gpg --keyserver pool.sks-keyservers.net --recv-keys D39DC0E3
 
-ARG COMMIT=latest
-RUN echo $COMMIT && apt-get update -q
+ARG python_sdk_version
+ARG cwl_runner_version
+RUN echo cwl_runner_version $cwl_runner_version python_sdk_version $python_sdk_version
 
-RUN apt-get install -qy git python-pip python-virtualenv python-arvados-python-client python-dev libgnutls28-dev libcurl4-gnutls-dev nodejs python-arvados-cwl-runner
+RUN apt-get update -q
+RUN apt-get install -yq --no-install-recommends \
+    git python-pip python-virtualenv \
+    python-dev libgnutls28-dev libcurl4-gnutls-dev nodejs \
+    python-arvados-python-client=$python_sdk_version \
+    python-arvados-cwl-runner=$cwl_runner_version
 
 # Install dependencies and set up system.
 RUN /usr/sbin/adduser --disabled-password \
index 6dc82c5a20b841b1aeb1400ecdaf7dd6c21d4ed5..960d7848de23b998ee4ce3d47edb38d35af54ea5 100755 (executable)
@@ -364,22 +364,27 @@ class WhRunPipelineInstance
     @components.each do |componentname, component|
       component[:script_parameters].each do |parametername, parameter|
         parameter = { :value => parameter } unless parameter.is_a? Hash
-        value =
-          (params["#{componentname}::#{parametername}"] ||
-           parameter[:value] ||
-           (parameter[:output_of].nil? &&
-            (params[parametername.to_s] ||
-             parameter[:default])) ||
-           nil)
-        if value.nil? and
-            ![false,'false',0,'0'].index parameter[:required]
-          if parameter[:output_of]
-            if not @components[parameter[:output_of].intern]
-              errors << [componentname, parametername, "output_of refers to nonexistent component '#{parameter[:output_of]}'"]
-            end
-            next
+        if params.has_key?("#{componentname}::#{parametername}")
+          value = params["#{componentname}::#{parametername}"]
+        elsif parameter.has_key?(:value)
+          value = parameter[:value]
+        elsif parameter.has_key?(:output_of)
+          if !@components[parameter[:output_of].intern]
+            errors << [componentname, parametername, "output_of refers to nonexistent component '#{parameter[:output_of]}'"]
+          else
+            # value will be filled in later when the upstream
+            # component's output becomes known
           end
+          next
+        elsif params.has_key?(parametername.to_s)
+          value = params[parametername.to_s]
+        elsif parameter.has_key?(:default)
+          value = parameter[:default]
+        elsif [false, 'false', 0, '0'].index(parameter[:required])
+          value = nil
+        else
           errors << [componentname, parametername, "required parameter is missing"]
+          next
         end
         debuglog "parameter #{componentname}::#{parametername} == #{value}"
 
index 7584d3a83d427de4cebf29b50109c21971c9fe59..358743608b1f7f5e796e5d3f3d90e3c9dc6f8cb6 100755 (executable)
@@ -1509,7 +1509,7 @@ sub preprocess_stderr
     my $line = $1;
     substr $jobstep[$jobstepidx]->{stderr}, 0, 1+length($line), "";
     Log ($jobstepidx, "stderr $line");
-    if ($line =~ /srun: error: (SLURM job $ENV{SLURM_JOB_ID} has expired|Unable to confirm allocation for job $ENV{SLURM_JOB_ID})/) {
+    if ($line =~ /srun: error: (SLURM job $ENV{SLURM_JOB_ID} has expired|Unable to confirm allocation for job $ENV{SLURM_JOB_ID})/i) {
       # If the allocation is revoked, we can't possibly continue, so mark all
       # nodes as failed.  This will cause the overall exit code to be
       # EX_RETRY_UNLOCKED instead of failure so that crunch_dispatch can re-run
@@ -1519,14 +1519,14 @@ sub preprocess_stderr
         $st->{node}->{fail_count}++;
       }
     }
-    elsif ($line =~ /srun: error: (Node failure on|Aborting, .*\bio error\b)/) {
+    elsif ($line =~ /srun: error: .*?\b(Node failure on|Aborting, .*?\bio error\b)/i) {
       $jobstep[$jobstepidx]->{tempfail} = 1;
       if (defined($job_slot_index)) {
         $slot[$job_slot_index]->{node}->{fail_count}++;
         ban_node_by_slot($job_slot_index);
       }
     }
-    elsif ($line =~ /srun: error: (Unable to create job step|.*: Communication connection failure)/) {
+    elsif ($line =~ /srun: error: (Unable to create job step|.*?: Communication connection failure)/i) {
       $jobstep[$jobstepidx]->{tempfail} = 1;
       ban_node_by_slot($job_slot_index) if (defined($job_slot_index));
     }
@@ -2104,7 +2104,7 @@ sub find_docker_image {
       }
     }
   }
-  if (defined($filename) and ($filename =~ /^([0-9A-Fa-f]{64})\.tar$/)) {
+  if (defined($filename) and ($filename =~ /^((?:sha256:)?[0-9A-Fa-f]{64})\.tar$/)) {
     return ($streamname, $1);
   } else {
     return (undef, undef);
index c90f8902684304b400cc7ece97068a8e6b094000..2b2e15bf6caf31f9016266879ec6e032df2e6380 100644 (file)
@@ -24,12 +24,13 @@ import arvados.config
 
 from .arvcontainer import ArvadosContainer, RunnerContainer
 from .arvjob import ArvadosJob, RunnerJob, RunnerTemplate
-from. runner import Runner
+from. runner import Runner, upload_instance
 from .arvtool import ArvadosCommandTool
 from .arvworkflow import ArvadosWorkflow, upload_workflow
 from .fsaccess import CollectionFsAccess
 from .perf import Perf
 from .pathmapper import FinalOutputPathMapper
+from ._version import __version__
 
 from cwltool.pack import pack
 from cwltool.process import shortname, UnsupportedRequirement, getListing
@@ -48,7 +49,7 @@ class ArvCwlRunner(object):
 
     """
 
-    def __init__(self, api_client, work_api=None, keep_client=None, output_name=None):
+    def __init__(self, api_client, work_api=None, keep_client=None, output_name=None, output_tags=None):
         self.api = api_client
         self.processes = {}
         self.lock = threading.Lock()
@@ -58,23 +59,33 @@ class ArvCwlRunner(object):
         self.uploaded = {}
         self.num_retries = 4
         self.uuid = None
-        self.work_api = work_api
         self.stop_polling = threading.Event()
         self.poll_api = None
         self.pipeline = None
         self.final_output_collection = None
         self.output_name = output_name
+        self.output_tags = output_tags
+        self.project_uuid = None
+
         if keep_client is not None:
             self.keep_client = keep_client
         else:
             self.keep_client = arvados.keep.KeepClient(api_client=self.api, num_retries=self.num_retries)
 
-        if self.work_api is None:
-            # todo: autodetect API to use.
-            self.work_api = "jobs"
-
-        if self.work_api not in ("containers", "jobs"):
-            raise Exception("Unsupported API '%s'" % self.work_api)
+        for api in ["jobs", "containers"]:
+            try:
+                methods = self.api._rootDesc.get('resources')[api]['methods']
+                if ('httpMethod' in methods['create'] and
+                    (work_api == api or work_api is None)):
+                    self.work_api = api
+                    break
+            except KeyError:
+                pass
+        if not self.work_api:
+            if work_api is None:
+                raise Exception("No supported APIs")
+            else:
+                raise Exception("Unsupported API '%s'" % work_api)
 
     def arv_make_tool(self, toolpath_object, **kwargs):
         kwargs["work_api"] = self.work_api
@@ -114,7 +125,8 @@ class ArvCwlRunner(object):
                     try:
                         self.cond.acquire()
                         j = self.processes[uuid]
-                        logger.info("Job %s (%s) is %s", j.name, uuid, event["properties"]["new_attributes"]["state"])
+                        txt = self.work_api[0].upper() + self.work_api[1:-1]
+                        logger.info("%s %s (%s) is %s", txt, j.name, uuid, event["properties"]["new_attributes"]["state"])
                         with Perf(metrics, "done %s" % j.name):
                             j.done(event["properties"]["new_attributes"])
                         self.cond.notify()
@@ -127,34 +139,43 @@ class ArvCwlRunner(object):
         Runs in a separate thread.
         """
 
-        while True:
-            self.stop_polling.wait(15)
-            if self.stop_polling.is_set():
-                break
-            with self.lock:
-                keys = self.processes.keys()
-            if not keys:
-                continue
-
-            if self.work_api == "containers":
-                table = self.poll_api.containers()
-            elif self.work_api == "jobs":
-                table = self.poll_api.jobs()
-
-            try:
-                proc_states = table.list(filters=[["uuid", "in", keys]]).execute(num_retries=self.num_retries)
-            except Exception as e:
-                logger.warn("Error checking states on API server: %s", e)
-                continue
-
-            for p in proc_states["items"]:
-                self.on_message({
-                    "object_uuid": p["uuid"],
-                    "event_type": "update",
-                    "properties": {
-                        "new_attributes": p
-                    }
-                })
+        try:
+            while True:
+                self.stop_polling.wait(15)
+                if self.stop_polling.is_set():
+                    break
+                with self.lock:
+                    keys = self.processes.keys()
+                if not keys:
+                    continue
+
+                if self.work_api == "containers":
+                    table = self.poll_api.containers()
+                elif self.work_api == "jobs":
+                    table = self.poll_api.jobs()
+
+                try:
+                    proc_states = table.list(filters=[["uuid", "in", keys]]).execute(num_retries=self.num_retries)
+                except Exception as e:
+                    logger.warn("Error checking states on API server: %s", e)
+                    continue
+
+                for p in proc_states["items"]:
+                    self.on_message({
+                        "object_uuid": p["uuid"],
+                        "event_type": "update",
+                        "properties": {
+                            "new_attributes": p
+                        }
+                    })
+        except:
+            logger.error("Fatal error in state polling thread.", exc_info=(sys.exc_info()[1] if self.debug else False))
+            self.cond.acquire()
+            self.processes.clear()
+            self.cond.notify()
+            self.cond.release()
+        finally:
+            self.stop_polling.set()
 
     def get_uploaded(self):
         return self.uploaded.copy()
@@ -172,7 +193,7 @@ class ArvCwlRunner(object):
             for v in obj:
                 self.check_writable(v)
 
-    def make_output_collection(self, name, outputObj):
+    def make_output_collection(self, name, tagsString, outputObj):
         outputObj = copy.deepcopy(outputObj)
 
         files = []
@@ -190,14 +211,28 @@ class ArvCwlRunner(object):
 
         srccollections = {}
         for k,v in generatemapper.items():
+            if k.startswith("_:"):
+                if v.type == "Directory":
+                    continue
+                if v.type == "CreateFile":
+                    with final.open(v.target, "wb") as f:
+                        f.write(v.resolved.encode("utf-8"))
+                    continue
+
+            if not k.startswith("keep:"):
+                raise Exception("Output source is not in keep or a literal")
             sp = k.split("/")
             srccollection = sp[0][5:]
             if srccollection not in srccollections:
-                srccollections[srccollection] = arvados.collection.CollectionReader(
-                    srccollection,
-                    api_client=self.api,
-                    keep_client=self.keep_client,
-                    num_retries=self.num_retries)
+                try:
+                    srccollections[srccollection] = arvados.collection.CollectionReader(
+                        srccollection,
+                        api_client=self.api,
+                        keep_client=self.keep_client,
+                        num_retries=self.num_retries)
+                except arvados.errors.ArgumentError as e:
+                    logger.error("Creating CollectionReader for '%s' '%s': %s", k, v, e)
+                    raise
             reader = srccollections[srccollection]
             try:
                 srcpath = "/".join(sp[1:]) if len(sp) > 1 else "."
@@ -207,7 +242,7 @@ class ArvCwlRunner(object):
 
         def rewrite(fileobj):
             fileobj["location"] = generatemapper.mapper(fileobj["location"]).target
-            for k in ("basename", "size", "listing"):
+            for k in ("basename", "listing", "contents"):
                 if k in fileobj:
                     del fileobj[k]
 
@@ -223,29 +258,64 @@ class ArvCwlRunner(object):
                     final.api_response()["name"],
                     final.manifest_locator())
 
-        self.final_output_collection = final
+        final_uuid = final.manifest_locator()
+        tags = tagsString.split(',')
+        for tag in tags:
+             self.api.links().create(body={
+                "head_uuid": final_uuid, "link_class": "tag", "name": tag
+                }).execute(num_retries=self.num_retries)
+
+        def finalcollection(fileobj):
+            fileobj["location"] = "keep:%s/%s" % (final.portable_data_hash(), fileobj["location"])
+
+        adjustDirObjs(outputObj, finalcollection)
+        adjustFileObjs(outputObj, finalcollection)
+
+        return (outputObj, final)
+
+    def set_crunch_output(self):
+        if self.work_api == "containers":
+            try:
+                current = self.api.containers().current().execute(num_retries=self.num_retries)
+                self.api.containers().update(uuid=current['uuid'],
+                                             body={
+                                                 'output': self.final_output_collection.portable_data_hash(),
+                                             }).execute(num_retries=self.num_retries)
+            except Exception as e:
+                logger.info("Setting container output: %s", e)
+        elif self.work_api == "jobs" and "TASK_UUID" in os.environ:
+            self.api.job_tasks().update(uuid=os.environ["TASK_UUID"],
+                                   body={
+                                       'output': self.final_output_collection.portable_data_hash(),
+                                       'success': self.final_status == "success",
+                                       'progress':1.0
+                                   }).execute(num_retries=self.num_retries)
 
     def arv_executor(self, tool, job_order, **kwargs):
         self.debug = kwargs.get("debug")
 
         tool.visit(self.check_writable)
 
-        useruuid = self.api.users().current().execute()["uuid"]
-        self.project_uuid = kwargs.get("project_uuid") if kwargs.get("project_uuid") else useruuid
+        self.project_uuid = kwargs.get("project_uuid")
         self.pipeline = None
         make_fs_access = kwargs.get("make_fs_access") or partial(CollectionFsAccess,
                                                                  api_client=self.api,
                                                                  keep_client=self.keep_client)
         self.fs_access = make_fs_access(kwargs["basedir"])
 
-        if kwargs.get("create_template"):
-            tmpl = RunnerTemplate(self, tool, job_order, kwargs.get("enable_reuse"))
-            tmpl.save()
-            # cwltool.main will write our return value to stdout.
-            return tmpl.uuid
-
-        if kwargs.get("create_workflow") or kwargs.get("update_workflow"):
-            return upload_workflow(self, tool, job_order, self.project_uuid, kwargs.get("update_workflow"))
+        existing_uuid = kwargs.get("update_workflow")
+        if existing_uuid or kwargs.get("create_workflow"):
+            if self.work_api == "jobs":
+                tmpl = RunnerTemplate(self, tool, job_order,
+                                      kwargs.get("enable_reuse"),
+                                      uuid=existing_uuid)
+                tmpl.save()
+                # cwltool.main will write our return value to stdout.
+                return tmpl.uuid
+            else:
+                return upload_workflow(self, tool, job_order,
+                                       self.project_uuid,
+                                       uuid=existing_uuid)
 
         self.ignore_docker_for_reuse = kwargs.get("ignore_docker_for_reuse")
 
@@ -266,6 +336,8 @@ class ArvCwlRunner(object):
             kwargs["docker_outdir"] = "$(task.outdir)"
             kwargs["tmpdir"] = "$(task.tmpdir)"
 
+        upload_instance(self, shortname(tool.tool["id"]), tool, job_order)
+
         runnerjob = None
         if kwargs.get("submit"):
             if self.work_api == "containers":
@@ -274,9 +346,9 @@ class ArvCwlRunner(object):
                                          self.output_callback,
                                          **kwargs).next()
                 else:
-                    runnerjob = RunnerContainer(self, tool, job_order, kwargs.get("enable_reuse"), self.output_name)
+                    runnerjob = RunnerContainer(self, tool, job_order, kwargs.get("enable_reuse"), self.output_name, self.output_tags)
             else:
-                runnerjob = RunnerJob(self, tool, job_order, kwargs.get("enable_reuse"), self.output_name)
+                runnerjob = RunnerJob(self, tool, job_order, kwargs.get("enable_reuse"), self.output_name, self.output_tags)
 
         if not kwargs.get("submit") and "cwl_runner_job" not in kwargs and not self.work_api == "containers":
             # Create pipeline for local run
@@ -289,7 +361,7 @@ class ArvCwlRunner(object):
             logger.info("Pipeline instance %s", self.pipeline["uuid"])
 
         if runnerjob and not kwargs.get("wait"):
-            runnerjob.run()
+            runnerjob.run(wait=kwargs.get("wait"))
             return runnerjob.uuid
 
         self.poll_api = arvados.api('v1')
@@ -315,6 +387,10 @@ class ArvCwlRunner(object):
             loopperf.__enter__()
             for runnable in jobiter:
                 loopperf.__exit__()
+
+                if self.stop_polling.is_set():
+                    break
+
                 if runnable:
                     with Perf(metrics, "run"):
                         runnable.run(**kwargs)
@@ -336,7 +412,7 @@ class ArvCwlRunner(object):
             if sys.exc_info()[0] is KeyboardInterrupt:
                 logger.error("Interrupted, marking pipeline as failed")
             else:
-                logger.error("Caught unhandled exception, marking pipeline as failed.  Error was: %s", sys.exc_info()[1], exc_info=(sys.exc_info()[1] if self.debug else False))
+                logger.error("Execution failed: %s", sys.exc_info()[1], exc_info=(sys.exc_info()[1] if self.debug else False))
             if self.pipeline:
                 self.api.pipeline_instances().update(uuid=self.pipeline["uuid"],
                                                      body={"state": "Failed"}).execute(num_retries=self.num_retries)
@@ -351,9 +427,6 @@ class ArvCwlRunner(object):
         if self.final_status == "UnsupportedRequirement":
             raise UnsupportedRequirement("Check log for details.")
 
-        if self.final_status != "success":
-            raise WorkflowException("Workflow failed.")
-
         if self.final_output is None:
             raise WorkflowException("Workflow did not return a result.")
 
@@ -362,7 +435,13 @@ class ArvCwlRunner(object):
         else:
             if self.output_name is None:
                 self.output_name = "Output of %s" % (shortname(tool.tool["id"]))
-            self.make_output_collection(self.output_name, self.final_output)
+            if self.output_tags is None:
+                self.output_tags = ""
+            self.final_output, self.final_output_collection = self.make_output_collection(self.output_name, self.output_tags, self.final_output)
+            self.set_crunch_output()
+
+        if self.final_status != "success":
+            raise WorkflowException("Workflow failed.")
 
         if kwargs.get("compute_checksum"):
             adjustDirObjs(self.final_output, partial(getListing, self.fs_access))
@@ -378,7 +457,7 @@ def versionstring():
     arvpkg = pkg_resources.require("arvados-python-client")
     cwlpkg = pkg_resources.require("cwltool")
 
-    return "%s %s, %s %s, %s %s" % (sys.argv[0], arvcwlpkg[0].version,
+    return "%s %s %s, %s %s, %s %s" % (sys.argv[0], __version__, arvcwlpkg[0].version,
                                     "arvados-python-client", arvpkg[0].version,
                                     "cwltool", cwlpkg[0].version)
 
@@ -416,6 +495,7 @@ def arg_parser():  # type: () -> argparse.ArgumentParser
 
     parser.add_argument("--project-uuid", type=str, metavar="UUID", help="Project that will own the workflow jobs, if not provided, will go to home project.")
     parser.add_argument("--output-name", type=str, help="Name to use for collection that stores the final output.", default=None)
+    parser.add_argument("--output-tags", type=str, help="Tags for the final output collection separated by commas, e.g., '--output-tags tag0,tag1,tag2'.", default=None)
     parser.add_argument("--ignore-docker-for-reuse", action="store_true",
                         help="Ignore Docker image version when deciding whether to reuse past jobs.",
                         default=False)
@@ -425,9 +505,10 @@ def arg_parser():  # type: () -> argparse.ArgumentParser
                         default=True, dest="submit")
     exgroup.add_argument("--local", action="store_false", help="Run workflow on local host (submits jobs to Arvados).",
                         default=True, dest="submit")
-    exgroup.add_argument("--create-template", action="store_true", help="Create an Arvados pipeline template.")
-    exgroup.add_argument("--create-workflow", action="store_true", help="Create an Arvados workflow.")
-    exgroup.add_argument("--update-workflow", type=str, metavar="UUID", help="Update existing Arvados workflow with uuid.")
+    exgroup.add_argument("--create-template", action="store_true", help="(Deprecated) synonym for --create-workflow.",
+                         dest="create_workflow")
+    exgroup.add_argument("--create-workflow", action="store_true", help="Create an Arvados workflow (if using the 'containers' API) or pipeline template (if using the 'jobs' API). See --api.")
+    exgroup.add_argument("--update-workflow", type=str, metavar="UUID", help="Update an existing Arvados workflow or pipeline template with the given UUID.")
 
     exgroup = parser.add_mutually_exclusive_group()
     exgroup.add_argument("--wait", action="store_true", help="After submitting workflow runner job, wait for completion.",
@@ -437,7 +518,7 @@ def arg_parser():  # type: () -> argparse.ArgumentParser
 
     parser.add_argument("--api", type=str,
                         default=None, dest="work_api",
-                        help="Select work submission API, one of 'jobs' or 'containers'.")
+                        help="Select work submission API, one of 'jobs' or 'containers'. Default is 'jobs' if that API is available, otherwise 'containers'.")
 
     parser.add_argument("--compute-checksum", action="store_true", default=False,
                         help="Compute checksum of contents while collecting outputs",
@@ -465,7 +546,21 @@ def main(args, stdout, stderr, api_client=None, keep_client=None):
 
     job_order_object = None
     arvargs = parser.parse_args(args)
-    if (arvargs.create_template or arvargs.create_workflow or arvargs.update_workflow) and not arvargs.job_order:
+
+    if arvargs.update_workflow:
+        if arvargs.update_workflow.find('-7fd4e-') == 5:
+            want_api = 'containers'
+        elif arvargs.update_workflow.find('-p5p6p-') == 5:
+            want_api = 'jobs'
+        else:
+            want_api = None
+        if want_api and arvargs.work_api and want_api != arvargs.work_api:
+            logger.error('--update-workflow arg {!r} uses {!r} API, but --api={!r} specified'.format(
+                arvargs.update_workflow, want_api, arvargs.work_api))
+            return 1
+        arvargs.work_api = want_api
+
+    if (arvargs.create_workflow or arvargs.update_workflow) and not arvargs.job_order:
         job_order_object = ({}, "")
 
     add_arv_hints()
@@ -473,7 +568,7 @@ def main(args, stdout, stderr, api_client=None, keep_client=None):
     try:
         if api_client is None:
             api_client=arvados.api('v1', model=OrderedJsonModel())
-        runner = ArvCwlRunner(api_client, work_api=arvargs.work_api, keep_client=keep_client, output_name=arvargs.output_name)
+        runner = ArvCwlRunner(api_client, work_api=arvargs.work_api, keep_client=keep_client, output_name=arvargs.output_name, output_tags=arvargs.output_tags)
     except Exception as e:
         logger.error(e)
         return 1
index a3220f97b7c7c1faa73b5df8898c25499ebbcb1c..1fda4122172c06f926ec89941868be4914be0b13 100644 (file)
@@ -11,7 +11,7 @@ import arvados.collection
 
 from .arvdocker import arv_docker_get_image
 from . import done
-from .runner import Runner
+from .runner import Runner, arvados_jobs_image
 
 logger = logging.getLogger('arvados.cwl-runner')
 
@@ -42,6 +42,7 @@ class ArvadosContainer(object):
                 "kind": "tmp"
             }
         }
+        scheduling_parameters = {}
 
         dirs = set()
         for f in self.pathmapper.files():
@@ -79,7 +80,7 @@ class ArvadosContainer(object):
 
         (docker_req, docker_is_req) = get_feature(self, "DockerRequirement")
         if not docker_req:
-            docker_req = {"dockerImageId": "arvados/jobs"}
+            docker_req = {"dockerImageId": arvados_jobs_image(self.arvrunner)}
 
         container_request["container_image"] = arv_docker_get_image(self.arvrunner.api,
                                                                      docker_req,
@@ -97,14 +98,17 @@ class ArvadosContainer(object):
 
         runtime_req, _ = get_feature(self, "http://arvados.org/cwl#RuntimeConstraints")
         if runtime_req:
-            logger.warn("RuntimeConstraints not yet supported by container API")
+            if "keep_cache" in runtime_req:
+                runtime_constraints["keep_cache_ram"] = runtime_req["keep_cache"]
 
         partition_req, _ = get_feature(self, "http://arvados.org/cwl#PartitionRequirement")
         if partition_req:
-            runtime_constraints["partition"] = aslist(partition_req["partition"])
+            scheduling_parameters["partitions"] = aslist(partition_req["partition"])
 
         container_request["mounts"] = mounts
         container_request["runtime_constraints"] = runtime_constraints
+        container_request["use_existing"] = kwargs.get("enable_reuse", True)
+        container_request["scheduling_parameters"] = scheduling_parameters
 
         try:
             response = self.arvrunner.api.container_requests().create(
@@ -113,10 +117,14 @@ class ArvadosContainer(object):
 
             self.arvrunner.processes[response["container_uuid"]] = self
 
-            logger.info("Container %s (%s) request state is %s", self.name, response["uuid"], response["state"])
+            container = self.arvrunner.api.containers().get(
+                uuid=response["container_uuid"]
+            ).execute(num_retries=self.arvrunner.num_retries)
+
+            logger.info("Container request %s (%s) state is %s with container %s %s", self.name, response["uuid"], response["state"], container["uuid"], container["state"])
 
-            if response["state"] == "Final":
-                self.done(response)
+            if container["state"] in ("Complete", "Cancelled"):
+                self.done(container)
         except Exception as e:
             logger.error("Got error %s" % str(e))
             self.output_callback({}, "permanentFail")
@@ -143,10 +151,17 @@ class ArvadosContainer(object):
                 if record["output"]:
                     outputs = done.done(self, record, "/tmp", self.outdir, "/keep")
             except WorkflowException as e:
-                logger.error("Error while collecting container outputs:\n%s", e, exc_info=(e if self.arvrunner.debug else False))
+                logger.error("Error while collecting output for container %s:\n%s", self.name, e, exc_info=(e if self.arvrunner.debug else False))
                 processStatus = "permanentFail"
             except Exception as e:
-                logger.exception("Got unknown exception while collecting job outputs:")
+                logger.exception("Got unknown exception while collecting output for container %s:", self.name)
+                processStatus = "permanentFail"
+
+            # Note: Currently, on error output_callback is expecting an empty dict,
+            # anything else will fail.
+            if not isinstance(outputs, dict):
+                logger.error("Unexpected output type %s '%s'", type(outputs), outputs)
+                outputs = {}
                 processStatus = "permanentFail"
 
             self.output_callback(outputs, processStatus)
@@ -179,14 +194,18 @@ class RunnerContainer(Runner):
         workflowcollection = workflowcollection[5:workflowcollection.index('/')]
         jobpath = "/var/lib/cwl/job/cwl.input.json"
 
-        container_image = arv_docker_get_image(self.arvrunner.api,
-                                               {"dockerImageId": "arvados/jobs"},
-                                               pull_image,
-                                               self.arvrunner.project_uuid)
-
         command = ["arvados-cwl-runner", "--local", "--api=containers"]
         if self.output_name:
             command.append("--output-name=" + self.output_name)
+
+        if self.output_tags:
+            command.append("--output-tags=" + self.output_tags)
+
+        if self.enable_reuse:
+            command.append("--enable-reuse")
+        else:
+            command.append("--disable-reuse")
+
         command.extend([workflowpath, jobpath])
 
         return {
@@ -197,7 +216,7 @@ class RunnerContainer(Runner):
             "cwd": "/var/spool/cwl",
             "priority": 1,
             "state": "Committed",
-            "container_image": container_image,
+            "container_image": arvados_jobs_image(self.arvrunner),
             "mounts": {
                 "/var/lib/cwl/workflow": {
                     "kind": "collection",
index c75e783ac2de0a0cdf967386983681ff4e5da678..b9691d215c4d46e071d13740c2d3c90b9f7d1a81 100644 (file)
@@ -1,19 +1,28 @@
 import logging
 import sys
+import threading
 
 import cwltool.docker
 from cwltool.errors import WorkflowException
 import arvados.commands.keepdocker
 
-
 logger = logging.getLogger('arvados.cwl-runner')
 
+cached_lookups = {}
+cached_lookups_lock = threading.Lock()
+
 def arv_docker_get_image(api_client, dockerRequirement, pull_image, project_uuid):
     """Check if a Docker image is available in Keep, if not, upload it using arv-keepdocker."""
 
     if "dockerImageId" not in dockerRequirement and "dockerPull" in dockerRequirement:
         dockerRequirement["dockerImageId"] = dockerRequirement["dockerPull"]
 
+    global cached_lookups
+    global cached_lookups_lock
+    with cached_lookups_lock:
+        if dockerRequirement["dockerImageId"] in cached_lookups:
+            return cached_lookups[dockerRequirement["dockerImageId"]]
+
     sp = dockerRequirement["dockerImageId"].split(":")
     image_name = sp[0]
     image_tag = sp[1] if len(sp) > 1 else None
@@ -23,21 +32,36 @@ def arv_docker_get_image(api_client, dockerRequirement, pull_image, project_uuid
                                                             image_tag=image_tag)
 
     if not images:
-        imageId = cwltool.docker.get_image(dockerRequirement, pull_image)
+        # Fetch Docker image if necessary.
+        cwltool.docker.get_image(dockerRequirement, pull_image)
+
+        # Upload image to Arvados
         args = ["--project-uuid="+project_uuid, image_name]
         if image_tag:
             args.append(image_tag)
         logger.info("Uploading Docker image %s", ":".join(args[1:]))
         try:
             arvados.commands.keepdocker.main(args, stdout=sys.stderr)
-        except SystemExit:
-            raise WorkflowException()
+        except SystemExit as e:
+            if e.code:
+                raise WorkflowException("keepdocker exited with code %s" % e.code)
 
-    images = arvados.commands.keepdocker.list_images_in_arv(api_client, 3,
-                                                            image_name=image_name,
-                                                            image_tag=image_tag)
+        images = arvados.commands.keepdocker.list_images_in_arv(api_client, 3,
+                                                                image_name=image_name,
+                                                                image_tag=image_tag)
 
-    #return dockerRequirement["dockerImageId"]
+    if not images:
+        raise WorkflowException("Could not find Docker image %s:%s" % (image_name, image_tag))
 
     pdh = api_client.collections().get(uuid=images[0][0]).execute()["portable_data_hash"]
+
+    with cached_lookups_lock:
+        cached_lookups[dockerRequirement["dockerImageId"]] = pdh
+
     return pdh
+
+def arv_docker_clear_cache():
+    global cached_lookups
+    global cached_lookups_lock
+    with cached_lookups_lock:
+        cached_lookups = {}
index 8b1a9346830b349e145fcb0fe5ec3f3cf1acf823..1afb9afc0e4cf4a888ad34b73cb0a5d7713f5ef9 100644 (file)
@@ -2,6 +2,7 @@ import logging
 import re
 import copy
 import json
+import time
 
 from cwltool.process import get_feature, shortname
 from cwltool.errors import WorkflowException
@@ -12,17 +13,16 @@ from cwltool.builder import Builder
 import arvados.collection
 
 from .arvdocker import arv_docker_get_image
-from .runner import Runner
+from .runner import Runner, arvados_jobs_image
 from .pathmapper import InitialWorkDirPathMapper
 from .perf import Perf
 from . import done
+from ._version import __version__
 
 logger = logging.getLogger('arvados.cwl-runner')
 metrics = logging.getLogger('arvados.cwl-runner.metrics')
 
-tmpdirre = re.compile(r"^\S+ \S+ \d+ \d+ stderr \S+ \S+ crunchrunner: \$\(task\.tmpdir\)=(.*)")
-outdirre = re.compile(r"^\S+ \S+ \d+ \d+ stderr \S+ \S+ crunchrunner: \$\(task\.outdir\)=(.*)")
-keepre = re.compile(r"^\S+ \S+ \d+ \d+ stderr \S+ \S+ crunchrunner: \$\(task\.keep\)=(.*)")
+crunchrunner_re = re.compile(r"^\S+ \S+ \d+ \d+ stderr \S+ \S+ crunchrunner: \$\(task\.(tmpdir|outdir|keep)\)=(.*)")
 
 class ArvadosJob(object):
     """Submit and manage a Crunch job for executing a CWL CommandLineTool."""
@@ -85,9 +85,11 @@ class ArvadosJob(object):
         with Perf(metrics, "arv_docker_get_image %s" % self.name):
             (docker_req, docker_is_req) = get_feature(self, "DockerRequirement")
             if docker_req and kwargs.get("use_container") is not False:
+                if docker_req.get("dockerOutputDirectory"):
+                    raise UnsupportedRequirement("Option 'dockerOutputDirectory' of DockerRequirement not supported.")
                 runtime_constraints["docker_image"] = arv_docker_get_image(self.arvrunner.api, docker_req, pull_image, self.arvrunner.project_uuid)
             else:
-                runtime_constraints["docker_image"] = "arvados/jobs"
+                runtime_constraints["docker_image"] = arvados_jobs_image(self.arvrunner)
 
         resources = self.builder.resources
         if resources is not None:
@@ -137,7 +139,7 @@ class ArvadosJob(object):
                 with Perf(metrics, "done %s" % self.name):
                     self.done(response)
         except Exception as e:
-            logger.error("Got error %s" % str(e))
+            logger.exception("Job %s error" % (self.name))
             self.output_callback({}, "permanentFail")
 
     def update_pipeline_component(self, record):
@@ -182,6 +184,7 @@ class ArvadosJob(object):
                                                                    keep_client=self.arvrunner.keep_client,
                                                                    num_retries=self.arvrunner.num_retries)
                         log = logc.open(logc.keys()[0])
+                        dirs = {}
                         tmpdir = None
                         outdir = None
                         keepdir = None
@@ -193,27 +196,26 @@ class ArvadosJob(object):
                             # the job restarts on a different node these values
                             # will different runs, and we need to know about the
                             # final run that actually produced output.
-
-                            g = tmpdirre.match(l)
-                            if g:
-                                tmpdir = g.group(1)
-                            g = outdirre.match(l)
+                            g = crunchrunner_re.match(l)
                             if g:
-                                outdir = g.group(1)
-                            g = keepre.match(l)
-                            if g:
-                                keepdir = g.group(1)
+                                dirs[g.group(1)] = g.group(2)
 
                     with Perf(metrics, "output collection %s" % self.name):
-                        outputs = done.done(self, record, tmpdir, outdir, keepdir)
+                        outputs = done.done(self, record, dirs["tmpdir"],
+                                            dirs["outdir"], dirs["keep"])
             except WorkflowException as e:
-                logger.error("Error while collecting job outputs:\n%s", e, exc_info=(e if self.arvrunner.debug else False))
+                logger.error("Error while collecting output for job %s:\n%s", self.name, e, exc_info=(e if self.arvrunner.debug else False))
                 processStatus = "permanentFail"
-                outputs = None
             except Exception as e:
-                logger.exception("Got unknown exception while collecting job outputs:")
+                logger.exception("Got unknown exception while collecting output for job %s:", self.name)
+                processStatus = "permanentFail"
+
+            # Note: Currently, on error output_callback is expecting an empty dict,
+            # anything else will fail.
+            if not isinstance(outputs, dict):
+                logger.error("Unexpected output type %s '%s'", type(outputs), outputs)
+                outputs = {}
                 processStatus = "permanentFail"
-                outputs = None
 
             self.output_callback(outputs, processStatus)
         finally:
@@ -233,43 +235,65 @@ class RunnerJob(Runner):
 
         workflowmapper = super(RunnerJob, self).arvados_job_spec(dry_run=dry_run, pull_image=pull_image, **kwargs)
 
+        # Need to filter this out, gets added by cwltool when providing
+        # parameters on the command line, and arv-run-pipeline-instance doesn't
+        # like it.
+        if "job_order" in self.job_order:
+            del self.job_order["job_order"]
+
         self.job_order["cwl:tool"] = workflowmapper.mapper(self.tool.tool["id"]).target[5:]
+
         if self.output_name:
             self.job_order["arv:output_name"] = self.output_name
+
+        if self.output_tags:
+            self.job_order["arv:output_tags"] = self.output_tags
+
+        self.job_order["arv:enable_reuse"] = self.enable_reuse
+
         return {
             "script": "cwl-runner",
-            "script_version": "master",
+            "script_version": __version__,
             "repository": "arvados",
             "script_parameters": self.job_order,
             "runtime_constraints": {
-                "docker_image": "arvados/jobs"
+                "docker_image": arvados_jobs_image(self.arvrunner)
             }
         }
 
     def run(self, *args, **kwargs):
         job_spec = self.arvados_job_spec(*args, **kwargs)
+
         job_spec.setdefault("owner_uuid", self.arvrunner.project_uuid)
 
-        response = self.arvrunner.api.jobs().create(
+        job = self.arvrunner.api.jobs().create(
             body=job_spec,
             find_or_create=self.enable_reuse
         ).execute(num_retries=self.arvrunner.num_retries)
 
-        self.uuid = response["uuid"]
+        for k,v in job_spec["script_parameters"].items():
+            if v is False or v is None or isinstance(v, dict):
+                job_spec["script_parameters"][k] = {"value": v}
+
+        del job_spec["owner_uuid"]
+        job_spec["job"] = job
+        self.arvrunner.pipeline = self.arvrunner.api.pipeline_instances().create(
+            body={
+                "owner_uuid": self.arvrunner.project_uuid,
+                "name": shortname(self.tool.tool["id"]),
+                "components": {"cwl-runner": job_spec },
+                "state": "RunningOnServer"}).execute(num_retries=self.arvrunner.num_retries)
+        logger.info("Created pipeline %s", self.arvrunner.pipeline["uuid"])
+
+        if kwargs.get("wait") is False:
+            self.uuid = self.arvrunner.pipeline["uuid"]
+            return
+
+        self.uuid = job["uuid"]
         self.arvrunner.processes[self.uuid] = self
 
-        logger.info("Submitted job %s", response["uuid"])
-
-        if kwargs.get("submit"):
-            self.arvrunner.pipeline = self.arvrunner.api.pipeline_instances().create(
-                body={
-                    "owner_uuid": self.arvrunner.project_uuid,
-                    "name": shortname(self.tool.tool["id"]),
-                    "components": {"cwl-runner": {"job": {"uuid": self.uuid, "state": response["state"]} } },
-                    "state": "RunningOnClient"}).execute(num_retries=self.arvrunner.num_retries)
-
-        if response["state"] in ("Complete", "Failed", "Cancelled"):
-            self.done(response)
+        if job["state"] in ("Complete", "Failed", "Cancelled"):
+            self.done(job)
 
 
 class RunnerTemplate(object):
@@ -284,7 +308,7 @@ class RunnerTemplate(object):
         'string': 'text',
     }
 
-    def __init__(self, runner, tool, job_order, enable_reuse):
+    def __init__(self, runner, tool, job_order, enable_reuse, uuid):
         self.runner = runner
         self.tool = tool
         self.job = RunnerJob(
@@ -292,7 +316,9 @@ class RunnerTemplate(object):
             tool=tool,
             job_order=job_order,
             enable_reuse=enable_reuse,
-            output_name=None)
+            output_name=None,
+            output_tags=None)
+        self.uuid = uuid
 
     def pipeline_component_spec(self):
         """Return a component that Workbench and a-r-p-i will understand.
@@ -300,6 +326,7 @@ class RunnerTemplate(object):
         Specifically, translate CWL input specs to Arvados pipeline
         format, like {"dataclass":"File","value":"xyz"}.
         """
+
         spec = self.job.arvados_job_spec()
 
         # Most of the component spec is exactly the same as the job
@@ -354,13 +381,21 @@ class RunnerTemplate(object):
         return spec
 
     def save(self):
-        job_spec = self.pipeline_component_spec()
-        response = self.runner.api.pipeline_templates().create(body={
+        body = {
             "components": {
-                self.job.name: job_spec,
+                self.job.name: self.pipeline_component_spec(),
             },
             "name": self.job.name,
-            "owner_uuid": self.runner.project_uuid,
-        }, ensure_unique_name=True).execute(num_retries=self.runner.num_retries)
-        self.uuid = response["uuid"]
-        logger.info("Created template %s", self.uuid)
+        }
+        if self.runner.project_uuid:
+            body["owner_uuid"] = self.runner.project_uuid
+        if self.uuid:
+            self.runner.api.pipeline_templates().update(
+                uuid=self.uuid, body=body).execute(
+                    num_retries=self.runner.num_retries)
+            logger.info("Updated template %s", self.uuid)
+        else:
+            self.uuid = self.runner.api.pipeline_templates().create(
+                body=body, ensure_unique_name=True).execute(
+                    num_retries=self.runner.num_retries)['uuid']
+            logger.info("Created template %s", self.uuid)
index 8eb8fe6fee50e0722ee7066171ff7b7bbc4a10c5..f425ae8df9d2478a566c3dc47aea7e7e1c678d45 100644 (file)
@@ -18,7 +18,7 @@ from .perf import Perf
 logger = logging.getLogger('arvados.cwl-runner')
 metrics = logging.getLogger('arvados.cwl-runner.metrics')
 
-def upload_workflow(arvRunner, tool, job_order, project_uuid, update_uuid):
+def upload_workflow(arvRunner, tool, job_order, project_uuid, uuid=None):
     upload_docker(arvRunner, tool)
 
     document_loader, workflowobj, uri = (tool.doc_loader, tool.doc_loader.fetch(tool.tool["id"]), tool.tool["id"])
@@ -39,16 +39,18 @@ def upload_workflow(arvRunner, tool, job_order, project_uuid, update_uuid):
 
     body = {
         "workflow": {
-            "owner_uuid": project_uuid,
             "name": tool.tool.get("label", name),
             "description": tool.tool.get("doc", ""),
             "definition":yaml.safe_dump(packed)
         }}
+    if project_uuid:
+        body["workflow"]["owner_uuid"] = project_uuid
 
-    if update_uuid:
-        return arvRunner.api.workflows().update(uuid=update_uuid, body=body).execute(num_retries=arvRunner.num_retries)["uuid"]
+    if uuid:
+        call = arvRunner.api.workflows().update(uuid=uuid, body=body)
     else:
-        return arvRunner.api.workflows().create(body=body).execute(num_retries=arvRunner.num_retries)["uuid"]
+        call = arvRunner.api.workflows().create(body=body)
+    return call.execute(num_retries=arvRunner.num_retries)["uuid"]
 
 class ArvadosWorkflow(Workflow):
     """Wrap cwltool Workflow to override selected methods."""
@@ -87,6 +89,8 @@ class ArvadosWorkflow(Workflow):
                 joborder_keepmount = copy.deepcopy(joborder)
 
                 def keepmount(obj):
+                    if "location" not in obj:
+                        raise WorkflowException("%s object is missing required 'location' field: %s" % (obj["class"], obj))
                     if obj["location"].startswith("keep:"):
                         obj["location"] = "/keep/" + obj["location"][5:]
                         if "listing" in obj:
diff --git a/sdk/cwl/arvados_cwl/crunch_script.py b/sdk/cwl/arvados_cwl/crunch_script.py
new file mode 100644 (file)
index 0000000..849b177
--- /dev/null
@@ -0,0 +1,109 @@
+# Crunch script integration for running arvados-cwl-runner (importing
+# arvados_cwl module) inside a crunch job.
+#
+# This gets the job record, transforms the script parameters into a valid CWL
+# input object, then executes the CWL runner to run the underlying workflow or
+# tool.  When the workflow completes, record the output object in an output
+# collection for this runner job.
+
+import arvados
+import arvados_cwl
+import arvados.collection
+import arvados.util
+import cwltool.main
+import logging
+import os
+import json
+import argparse
+import re
+import functools
+
+from arvados.api import OrderedJsonModel
+from cwltool.process import shortname, adjustFileObjs, adjustDirObjs, getListing, normalizeFilesDirs
+from cwltool.load_tool import load_tool
+from cwltool.errors import WorkflowException
+
+logger = logging.getLogger('arvados.cwl-runner')
+
+def run():
+    # Print package versions
+    logger.info(arvados_cwl.versionstring())
+
+    api = arvados.api("v1")
+
+    arvados_cwl.add_arv_hints()
+
+    runner = None
+    try:
+        job_order_object = arvados.current_job()['script_parameters']
+
+        pdh_path = re.compile(r'^[0-9a-f]{32}\+\d+(/.+)?$')
+
+        def keeppath(v):
+            if pdh_path.match(v):
+                return "keep:%s" % v
+            else:
+                return v
+
+        def keeppathObj(v):
+            v["location"] = keeppath(v["location"])
+
+        job_order_object["cwl:tool"] = "file://%s/%s" % (os.environ['TASK_KEEPMOUNT'], job_order_object["cwl:tool"])
+
+        for k,v in job_order_object.items():
+            if isinstance(v, basestring) and arvados.util.keep_locator_pattern.match(v):
+                job_order_object[k] = {
+                    "class": "File",
+                    "location": "keep:%s" % v
+                }
+
+        adjustFileObjs(job_order_object, keeppathObj)
+        adjustDirObjs(job_order_object, keeppathObj)
+        normalizeFilesDirs(job_order_object)
+        adjustDirObjs(job_order_object, functools.partial(getListing, arvados_cwl.fsaccess.CollectionFsAccess("", api_client=api)))
+
+        output_name = None
+        output_tags = None
+        enable_reuse = True
+        if "arv:output_name" in job_order_object:
+            output_name = job_order_object["arv:output_name"]
+            del job_order_object["arv:output_name"]
+
+        if "arv:output_tags" in job_order_object:
+            output_tags = job_order_object["arv:output_tags"]
+            del job_order_object["arv:output_tags"]
+
+        if "arv:enable_reuse" in job_order_object:
+            enable_reuse = job_order_object["arv:enable_reuse"]
+            del job_order_object["arv:enable_reuse"]
+
+        runner = arvados_cwl.ArvCwlRunner(api_client=arvados.api('v1', model=OrderedJsonModel()),
+                                          output_name=output_name, output_tags=output_tags)
+
+        t = load_tool(job_order_object, runner.arv_make_tool)
+
+        args = argparse.Namespace()
+        args.project_uuid = arvados.current_job()["owner_uuid"]
+        args.enable_reuse = enable_reuse
+        args.submit = False
+        args.debug = True
+        args.quiet = False
+        args.ignore_docker_for_reuse = False
+        args.basedir = os.getcwd()
+        args.cwl_runner_job={"uuid": arvados.current_job()["uuid"], "state": arvados.current_job()["state"]}
+        outputObj = runner.arv_executor(t, job_order_object, **vars(args))
+    except Exception as e:
+        if isinstance(e, WorkflowException):
+            logging.info("Workflow error %s", e)
+        else:
+            logging.exception("Unhandled exception")
+        if runner and runner.final_output_collection:
+            outputCollection = runner.final_output_collection.portable_data_hash()
+        else:
+            outputCollection = None
+        api.job_tasks().update(uuid=arvados.current_task()['uuid'],
+                                             body={
+                                                 'output': outputCollection,
+                                                 'success': False,
+                                                 'progress':1.0
+                                             }).execute()
index 228d43304af9e4345b1800043b175cb0ec13f594..58500d3a993ddb74327c419925c2aed2b769a1b6 100644 (file)
@@ -37,11 +37,11 @@ class ArvPathMapper(PathMapper):
                 # Local FS ref, may need to be uploaded or may be on keep
                 # mount.
                 ab = abspath(src, self.input_basedir)
-                st = arvados.commands.run.statfile("", ab, fnPattern=self.file_pattern)
+                st = arvados.commands.run.statfile("", ab, fnPattern="keep:%s/%s")
                 if isinstance(st, arvados.commands.run.UploadFile):
                     uploadfiles.add((src, ab, st))
                 elif isinstance(st, arvados.commands.run.ArvFile):
-                    self._pathmap[src] = MapperEnt(ab, st.fn, "File")
+                    self._pathmap[src] = MapperEnt(st.fn, self.collection_pattern % st.fn[5:], "File")
                 elif src.startswith("_:"):
                     if "contents" in srcobj:
                         pass
@@ -78,9 +78,11 @@ class ArvPathMapper(PathMapper):
 
     def setup(self, referenced_files, basedir):
         # type: (List[Any], unicode) -> None
-        self._pathmap = self.arvrunner.get_uploaded()
         uploadfiles = set()
 
+        for k,v in self.arvrunner.get_uploaded().iteritems():
+            self._pathmap[k] = MapperEnt(v.resolved, self.collection_pattern % v.resolved[5:], "File")
+
         for srcobj in referenced_files:
             self.visit(srcobj, uploadfiles)
 
@@ -89,12 +91,12 @@ class ArvPathMapper(PathMapper):
                                              self.arvrunner.api,
                                              dry_run=False,
                                              num_retries=self.arvrunner.num_retries,
-                                             fnPattern=self.file_pattern,
+                                             fnPattern="keep:%s/%s",
                                              name=self.name,
                                              project=self.arvrunner.project_uuid)
 
         for src, ab, st in uploadfiles:
-            self._pathmap[src] = MapperEnt("keep:" + st.keepref, st.fn, "File")
+            self._pathmap[src] = MapperEnt(st.fn, self.collection_pattern % st.fn[5:], "File")
             self.arvrunner.add_uploaded(src, self._pathmap[src])
 
         for srcobj in referenced_files:
@@ -148,27 +150,31 @@ class ArvPathMapper(PathMapper):
         else:
             return super(ArvPathMapper, self).reversemap(target)
 
-class InitialWorkDirPathMapper(PathMapper):
+class StagingPathMapper(PathMapper):
+    _follow_dirs = True
 
     def visit(self, obj, stagedir, basedir, copy=False):
         # type: (Dict[unicode, Any], unicode, unicode, bool) -> None
         loc = obj["location"]
+        tgt = os.path.join(stagedir, obj["basename"])
         if obj["class"] == "Directory":
-            self._pathmap[loc] = MapperEnt(obj["location"], stagedir, "Directory")
-            self.visitlisting(obj.get("listing", []), stagedir, basedir)
+            self._pathmap[loc] = MapperEnt(loc, tgt, "Directory")
+            if loc.startswith("_:") or self._follow_dirs:
+                self.visitlisting(obj.get("listing", []), tgt, basedir)
         elif obj["class"] == "File":
             if loc in self._pathmap:
                 return
-            tgt = os.path.join(stagedir, obj["basename"])
-            if "contents" in obj and obj["location"].startswith("_:"):
+            if "contents" in obj and loc.startswith("_:"):
                 self._pathmap[loc] = MapperEnt(obj["contents"], tgt, "CreateFile")
             else:
                 if copy:
-                    self._pathmap[loc] = MapperEnt(obj["path"], tgt, "WritableFile")
+                    self._pathmap[loc] = MapperEnt(loc, tgt, "WritableFile")
                 else:
-                    self._pathmap[loc] = MapperEnt(obj["path"], tgt, "File")
+                    self._pathmap[loc] = MapperEnt(loc, tgt, "File")
                 self.visitlisting(obj.get("secondaryFiles", []), stagedir, basedir)
 
+
+class InitialWorkDirPathMapper(StagingPathMapper):
     def setup(self, referenced_files, basedir):
         # type: (List[Any], unicode) -> None
 
@@ -181,19 +187,8 @@ class InitialWorkDirPathMapper(PathMapper):
                 self._pathmap[path] = MapperEnt("$(task.keep)/%s" % ab[5:], tgt, type)
 
 
-class FinalOutputPathMapper(PathMapper):
-    def visit(self, obj, stagedir, basedir, copy=False):
-        # type: (Dict[unicode, Any], unicode, unicode, bool) -> None
-        loc = obj["location"]
-        if obj["class"] == "Directory":
-            self._pathmap[loc] = MapperEnt(loc, stagedir, "Directory")
-        elif obj["class"] == "File":
-            if loc in self._pathmap:
-                return
-            tgt = os.path.join(stagedir, obj["basename"])
-            self._pathmap[loc] = MapperEnt(loc, tgt, "File")
-            self.visitlisting(obj.get("secondaryFiles", []), stagedir, basedir)
-
+class FinalOutputPathMapper(StagingPathMapper):
+    _follow_dirs = False
     def setup(self, referenced_files, basedir):
         # type: (List[Any], unicode) -> None
         self.visitlisting(referenced_files, self.stagedir, basedir)
index e5b4e006e8cce7cac780436fc06c6dcd79882730..3bbcb8b091763cd565051c23a65ce13d1069f08f 100644 (file)
@@ -9,15 +9,18 @@ from cStringIO import StringIO
 import cwltool.draft2tool
 from cwltool.draft2tool import CommandLineTool
 import cwltool.workflow
-from cwltool.process import get_feature, scandeps, UnsupportedRequirement, normalizeFilesDirs
+from cwltool.process import get_feature, scandeps, UnsupportedRequirement, normalizeFilesDirs, shortname
 from cwltool.load_tool import fetch_document
 from cwltool.pathmapper import adjustFileObjs, adjustDirObjs
+from cwltool.utils import aslist
+from cwltool.builder import substitute
 
 import arvados.collection
 import ruamel.yaml as yaml
 
 from .arvdocker import arv_docker_get_image
 from .pathmapper import ArvPathMapper
+from ._version import __version__
 
 logger = logging.getLogger('arvados.cwl-runner')
 
@@ -107,14 +110,58 @@ def upload_docker(arvrunner, tool):
     if isinstance(tool, CommandLineTool):
         (docker_req, docker_is_req) = get_feature(tool, "DockerRequirement")
         if docker_req:
+            if docker_req.get("dockerOutputDirectory"):
+                # TODO: can be supported by containers API, but not jobs API.
+                raise UnsupportedRequirement("Option 'dockerOutputDirectory' of DockerRequirement not supported.")
             arv_docker_get_image(arvrunner.api, docker_req, True, arvrunner.project_uuid)
     elif isinstance(tool, cwltool.workflow.Workflow):
         for s in tool.steps:
             upload_docker(arvrunner, s.embedded_tool)
 
+def upload_instance(arvrunner, name, tool, job_order):
+        upload_docker(arvrunner, tool)
+
+        for t in tool.tool["inputs"]:
+            def setSecondary(fileobj):
+                if isinstance(fileobj, dict) and fileobj.get("class") == "File":
+                    if "secondaryFiles" not in fileobj:
+                        fileobj["secondaryFiles"] = [{"location": substitute(fileobj["location"], sf), "class": "File"} for sf in t["secondaryFiles"]]
+
+                if isinstance(fileobj, list):
+                    for e in fileobj:
+                        setSecondary(e)
+
+            if shortname(t["id"]) in job_order and t.get("secondaryFiles"):
+                setSecondary(job_order[shortname(t["id"])])
+
+        workflowmapper = upload_dependencies(arvrunner,
+                                             name,
+                                             tool.doc_loader,
+                                             tool.tool,
+                                             tool.tool["id"],
+                                             True)
+        jobmapper = upload_dependencies(arvrunner,
+                                        os.path.basename(job_order.get("id", "#")),
+                                        tool.doc_loader,
+                                        job_order,
+                                        job_order.get("id", "#"),
+                                        False)
+
+        if "id" in job_order:
+            del job_order["id"]
+
+        return workflowmapper
+
+def arvados_jobs_image(arvrunner):
+    img = "arvados/jobs:"+__version__
+    try:
+        arv_docker_get_image(arvrunner.api, {"dockerPull": img}, True, arvrunner.project_uuid)
+    except Exception as e:
+        raise Exception("Docker image %s is not available\n%s" % (img, e) )
+    return img
 
 class Runner(object):
-    def __init__(self, runner, tool, job_order, enable_reuse, output_name):
+    def __init__(self, runner, tool, job_order, enable_reuse, output_name, output_tags):
         self.arvrunner = runner
         self.tool = tool
         self.job_order = job_order
@@ -123,37 +170,17 @@ class Runner(object):
         self.uuid = None
         self.final_output = None
         self.output_name = output_name
+        self.output_tags = output_tags
 
     def update_pipeline_component(self, record):
         pass
 
     def arvados_job_spec(self, *args, **kwargs):
-        upload_docker(self.arvrunner, self.tool)
-
         self.name = os.path.basename(self.tool.tool["id"])
-
-        workflowmapper = upload_dependencies(self.arvrunner,
-                                             self.name,
-                                             self.tool.doc_loader,
-                                             self.tool.tool,
-                                             self.tool.tool["id"],
-                                             True)
-
-        jobmapper = upload_dependencies(self.arvrunner,
-                                        os.path.basename(self.job_order.get("id", "#")),
-                                        self.tool.doc_loader,
-                                        self.job_order,
-                                        self.job_order.get("id", "#"),
-                                        False)
-
+        workflowmapper = upload_instance(self.arvrunner, self.name, self.tool, self.job_order)
         adjustDirObjs(self.job_order, trim_listing)
-
-        if "id" in self.job_order:
-            del self.job_order["id"]
-
         return workflowmapper
 
-
     def done(self, record):
         if record["state"] == "Complete":
             if record.get("exit_code") is not None:
@@ -168,7 +195,7 @@ class Runner(object):
         else:
             processStatus = "permanentFail"
 
-        outputs = None
+        outputs = {}
         try:
             try:
                 self.final_output = record["output"]
@@ -185,7 +212,7 @@ class Runner(object):
                 adjustFileObjs(outputs, keepify)
                 adjustDirObjs(outputs, keepify)
             except Exception as e:
-                logger.error("While getting final output object: %s", e)
+                logger.exception("While getting final output object: %s", e)
             self.arvrunner.output_callback(outputs, processStatus)
         finally:
             del self.arvrunner.processes[record["uuid"]]
deleted file mode 120000 (symlink)
index d59c02ca1758d4b5e484cb6e3280ba0ae2b7c5ea..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-../python/gittaggers.py
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..2a292ee061b412d85216c68b81e2d0acd9557765
--- /dev/null
@@ -0,0 +1,37 @@
+from setuptools.command.egg_info import egg_info
+import subprocess
+import time
+import os
+
+SETUP_DIR = os.path.dirname(__file__) or '.'
+
+def choose_version_from():
+    sdk_ts = subprocess.check_output(
+        ['git', 'log', '--first-parent', '--max-count=1',
+         '--format=format:%ct', os.path.join(SETUP_DIR, "../python")]).strip()
+    cwl_ts = subprocess.check_output(
+        ['git', 'log', '--first-parent', '--max-count=1',
+         '--format=format:%ct', SETUP_DIR]).strip()
+    if int(sdk_ts) > int(cwl_ts):
+        getver = os.path.join(SETUP_DIR, "../python")
+    else:
+        getver = SETUP_DIR
+    return getver
+
+class EggInfoFromGit(egg_info):
+    """Tag the build with git commit timestamp.
+
+    If a build tag has already been set (e.g., "egg_info -b", building
+    from source package), leave it alone.
+    """
+
+    def git_timestamp_tag(self):
+        gitinfo = subprocess.check_output(
+            ['git', 'log', '--first-parent', '--max-count=1',
+             '--format=format:%ct', choose_version_from()]).strip()
+        return time.strftime('.%Y%m%d%H%M%S', time.gmtime(int(gitinfo)))
+
+    def tags(self):
+        if self.tag_build is None:
+            self.tag_build = self.git_timestamp_tag()
+        return egg_info.tags(self)
index 43cae78a9ad05bb9d4ba0a4e54837af4f18e0c9f..9d9a1e1a7acf99f46d61d96de384681da114925a 100644 (file)
@@ -2,6 +2,7 @@
 
 import os
 import sys
+import subprocess
 import setuptools.command.egg_info as egg_info_cmd
 
 from setuptools import setup, find_packages
@@ -15,6 +16,20 @@ try:
 except ImportError:
     tagger = egg_info_cmd.egg_info
 
+versionfile = os.path.join(SETUP_DIR, "arvados_cwl/_version.py")
+try:
+    gitinfo = subprocess.check_output(
+        ['git', 'log', '--first-parent', '--max-count=1',
+         '--format=format:%H', gittaggers.choose_version_from()]).strip()
+    with open(versionfile, "w") as f:
+        f.write("__version__ = '%s'\n" % gitinfo)
+except Exception as e:
+    # When installing from package, it won't be part of a git repository, and
+    # check_output() will raise an exception.  But the package should include the
+    # version file, so we can proceed.
+    if not os.path.exists(versionfile):
+        raise
+
 setup(name='arvados-cwl-runner',
       version='1.0',
       description='Arvados Common Workflow Language runner',
@@ -33,7 +48,7 @@ setup(name='arvados-cwl-runner',
       # Make sure to update arvados/build/run-build-packages.sh as well
       # when updating the cwltool version pin.
       install_requires=[
-          'cwltool==1.0.20161007181528',
+          'cwltool==1.0.20161107145355',
           'arvados-python-client>=0.1.20160826210445'
       ],
       data_files=[
index 3b16bbcc200819f04386db92b698db5b46f276c8..ee8daa1e15cbfc1147a00839b8d7da9f69c7d1fe 100755 (executable)
@@ -9,7 +9,6 @@ fi
 reset_container=1
 leave_running=0
 config=dev
-docker_pull=1
 tag=""
 
 while test -n "$1" ; do
@@ -27,16 +26,12 @@ while test -n "$1" ; do
             config=$2
             shift ; shift
             ;;
-        --no-docker-pull)
-            docker_pull=0
-            shift
-            ;;
         --tag)
             tag=$2
             shift ; shift
             ;;
         -h|--help)
-            echo "$0 [--no-reset-container] [--leave-running] [--no-docker-pull] [--config dev|localdemo] [--tag docker_tag]"
+            echo "$0 [--no-reset-container] [--leave-running] [--config dev|localdemo] [--tag docker_tag]"
             exit
             ;;
         *)
@@ -60,9 +55,11 @@ set -eu -o pipefail
 
 . /usr/local/lib/arvbox/common.sh
 
-cd /usr/src/arvados/sdk/cwl
-python setup.py sdist
-pip_install \$(ls -r dist/arvados-cwl-runner-*.tar.gz | head -n1)
+if test $config = dev ; then
+  cd /usr/src/arvados/sdk/cwl
+  python setup.py sdist
+  pip_install \$(ls -r dist/arvados-cwl-runner-*.tar.gz | head -n1)
+fi
 
 mkdir -p /tmp/cwltest
 cd /tmp/cwltest
@@ -75,10 +72,6 @@ export ARVADOS_API_HOST=localhost:8000
 export ARVADOS_API_HOST_INSECURE=1
 export ARVADOS_API_TOKEN=\$(cat /var/lib/arvados/superuser_token)
 
-if test $docker_pull = 1 ; then
-  arv-keepdocker --pull arvados/jobs $tag
-fi
-
 cat >/tmp/cwltest/arv-cwl-jobs <<EOF2
 #!/bin/sh
 exec arvados-cwl-runner --api=jobs --compute-checksum \\\$@
diff --git a/sdk/cwl/tests/hw.py b/sdk/cwl/tests/hw.py
new file mode 100644 (file)
index 0000000..62c813a
--- /dev/null
@@ -0,0 +1 @@
+print "Hello world"
diff --git a/sdk/cwl/tests/mock_discovery.py b/sdk/cwl/tests/mock_discovery.py
new file mode 100644 (file)
index 0000000..f31ff22
--- /dev/null
@@ -0,0 +1,13 @@
+import json
+import arvados
+
+_rootDesc = None
+
+def get_rootDesc():
+    global _rootDesc
+    if not _rootDesc:
+        try:
+            _rootDesc = arvados.api('v1')._rootDesc
+        except ValueError:
+            raise Exception("Test requires an running API server to fetch discovery document")
+    return _rootDesc
index b5499970531008a7474f2ae99fb5de48f1234aa2..bb4bac31dd1767081cdc12a313496a4bb13b4546 100644 (file)
@@ -1,4 +1,5 @@
 import arvados_cwl
+from arvados_cwl.arvdocker import arv_docker_clear_cache
 import logging
 import mock
 import unittest
@@ -20,55 +21,62 @@ class TestContainer(unittest.TestCase):
     # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
     @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
     def test_run(self, keepdocker):
-        runner = mock.MagicMock()
-        runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
-        runner.ignore_docker_for_reuse = False
-
-        keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
-        runner.api.collections().get().execute.return_value = {
-            "portable_data_hash": "99999999999999999999999999999993+99"}
-
-        document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
-
-        tool = {
-            "inputs": [],
-            "outputs": [],
-            "baseCommand": "ls",
-            "arguments": [{"valueFrom": "$(runtime.outdir)"}]
-        }
-        make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
-        arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers", avsc_names=avsc_names,
-                                                 basedir="", make_fs_access=make_fs_access, loader=Loader({}))
-        arvtool.formatgraph = None
-        for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_run",
-                             make_fs_access=make_fs_access, tmpdir="/tmp"):
-            j.run()
-            runner.api.container_requests().create.assert_called_with(
-                body={
-                    'environment': {
-                        'HOME': '/var/spool/cwl',
-                        'TMPDIR': '/tmp'
-                    },
-                    'name': 'test_run',
-                    'runtime_constraints': {
-                        'vcpus': 1,
-                        'ram': 1073741824
-                    }, 'priority': 1,
-                    'mounts': {
-                        '/var/spool/cwl': {'kind': 'tmp'}
-                    },
-                    'state': 'Committed',
-                    'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
-                    'output_path': '/var/spool/cwl',
-                    'container_image': '99999999999999999999999999999993+99',
-                    'command': ['ls', '/var/spool/cwl'],
-                    'cwd': '/var/spool/cwl'
-                })
+        for enable_reuse in (True, False):
+            arv_docker_clear_cache()
+
+            runner = mock.MagicMock()
+            runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
+            runner.ignore_docker_for_reuse = False
+
+            keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
+            runner.api.collections().get().execute.return_value = {
+                "portable_data_hash": "99999999999999999999999999999993+99"}
+
+            document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
+
+            tool = {
+                "inputs": [],
+                "outputs": [],
+                "baseCommand": "ls",
+                "arguments": [{"valueFrom": "$(runtime.outdir)"}]
+            }
+            make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
+            arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers", avsc_names=avsc_names,
+                                                     basedir="", make_fs_access=make_fs_access, loader=Loader({}))
+            arvtool.formatgraph = None
+            for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_run_"+str(enable_reuse),
+                                 make_fs_access=make_fs_access, tmpdir="/tmp"):
+                j.run(enable_reuse=enable_reuse)
+                runner.api.container_requests().create.assert_called_with(
+                    body={
+                        'environment': {
+                            'HOME': '/var/spool/cwl',
+                            'TMPDIR': '/tmp'
+                        },
+                        'name': 'test_run_'+str(enable_reuse),
+                        'runtime_constraints': {
+                            'vcpus': 1,
+                            'ram': 1073741824
+                        },
+                        'use_existing': enable_reuse,
+                        'priority': 1,
+                        'mounts': {
+                            '/var/spool/cwl': {'kind': 'tmp'}
+                        },
+                        'state': 'Committed',
+                        'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
+                        'output_path': '/var/spool/cwl',
+                        'container_image': '99999999999999999999999999999993+99',
+                        'command': ['ls', '/var/spool/cwl'],
+                        'cwd': '/var/spool/cwl',
+                        'scheduling_parameters': {}
+                    })
 
     # The test passes some fields in builder.resources
     # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
     @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
     def test_resource_requirements(self, keepdocker):
+        arv_docker_clear_cache()
         runner = mock.MagicMock()
         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
         runner.ignore_docker_for_reuse = False
@@ -106,8 +114,9 @@ class TestContainer(unittest.TestCase):
                              make_fs_access=make_fs_access, tmpdir="/tmp"):
             j.run()
 
-        runner.api.container_requests().create.assert_called_with(
-            body={
+        call_args, call_kwargs = runner.api.container_requests().create.call_args
+
+        call_body_expected = {
                 'environment': {
                     'HOME': '/var/spool/cwl',
                     'TMPDIR': '/tmp'
@@ -116,9 +125,11 @@ class TestContainer(unittest.TestCase):
                 'runtime_constraints': {
                     'vcpus': 3,
                     'ram': 3145728000,
-                    'API': True,
-                    'partition': ['blurb']
-                }, 'priority': 1,
+                    'keep_cache_ram': 512,
+                    'API': True
+                },
+                'use_existing': True,
+                'priority': 1,
                 'mounts': {
                     '/var/spool/cwl': {'kind': 'tmp'}
                 },
@@ -127,8 +138,16 @@ class TestContainer(unittest.TestCase):
                 'output_path': '/var/spool/cwl',
                 'container_image': '99999999999999999999999999999993+99',
                 'command': ['ls'],
-                'cwd': '/var/spool/cwl'
-            })
+                'cwd': '/var/spool/cwl',
+                'scheduling_parameters': {
+                    'partitions': ['blurb']
+                }
+        }
+
+        call_body = call_kwargs.get('body', None)
+        self.assertNotEqual(None, call_body)
+        for key in call_body:
+            self.assertEqual(call_body_expected.get(key), call_body.get(key))
 
     @mock.patch("arvados.collection.Collection")
     def test_done(self, col):
index 8d12aab7e2e6a931a3a92db17b587e5c3d8db036..c8813adf7ea48d71f5b5b8cb9d7c091bfafa09c0 100644 (file)
@@ -1,79 +1,91 @@
+import functools
+import json
 import logging
 import mock
-import unittest
 import os
-import functools
-import json
+import unittest
+import copy
+import StringIO
 
+import arvados
 import arvados_cwl
 import cwltool.process
 from schema_salad.ref_resolver import Loader
+from .mock_discovery import get_rootDesc
 
 if not os.getenv('ARVADOS_DEBUG'):
     logging.getLogger('arvados.cwl-runner').setLevel(logging.WARN)
     logging.getLogger('arvados.arv-run').setLevel(logging.WARN)
 
-
 class TestJob(unittest.TestCase):
 
     # The test passes no builder.resources
     # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
-    def test_run(self):
-        runner = mock.MagicMock()
-        runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
-        runner.ignore_docker_for_reuse = False
-        runner.num_retries = 0
-        document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
+    @mock.patch('arvados.commands.keepdocker.list_images_in_arv')
+    def test_run(self, list_images_in_arv):
+        for enable_reuse in (True, False):
+            runner = mock.MagicMock()
+            runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
+            runner.ignore_docker_for_reuse = False
+            runner.num_retries = 0
+            document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
 
-        tool = {
-            "inputs": [],
-            "outputs": [],
-            "baseCommand": "ls",
-            "arguments": [{"valueFrom": "$(runtime.outdir)"}]
-        }
-        make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
-        arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="jobs", avsc_names=avsc_names,
-                                                 basedir="", make_fs_access=make_fs_access, loader=Loader({}))
-        arvtool.formatgraph = None
-        for j in arvtool.job({}, mock.MagicMock(), basedir="", make_fs_access=make_fs_access):
-            j.run()
-            runner.api.jobs().create.assert_called_with(
-                body={
-                    'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
-                    'runtime_constraints': {},
-                    'script_parameters': {
-                        'tasks': [{
-                            'task.env': {'HOME': '$(task.outdir)', 'TMPDIR': '$(task.tmpdir)'},
-                            'command': ['ls', '$(task.outdir)']
-                        }],
+            list_images_in_arv.return_value = [["zzzzz-4zz18-zzzzzzzzzzzzzzz"]]
+            runner.api.collections().get().execute.return_vaulue = {"portable_data_hash": "99999999999999999999999999999993+99"}
+
+            tool = {
+                "inputs": [],
+                "outputs": [],
+                "baseCommand": "ls",
+                "arguments": [{"valueFrom": "$(runtime.outdir)"}]
+            }
+            make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
+            arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="jobs", avsc_names=avsc_names,
+                                                     basedir="", make_fs_access=make_fs_access, loader=Loader({}))
+            arvtool.formatgraph = None
+            for j in arvtool.job({}, mock.MagicMock(), basedir="", make_fs_access=make_fs_access):
+                j.run(enable_reuse=enable_reuse)
+                runner.api.jobs().create.assert_called_with(
+                    body={
+                        'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
+                        'runtime_constraints': {},
+                        'script_parameters': {
+                            'tasks': [{
+                                'task.env': {'HOME': '$(task.outdir)', 'TMPDIR': '$(task.tmpdir)'},
+                                'command': ['ls', '$(task.outdir)']
+                            }],
+                        },
+                        'script_version': 'master',
+                        'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
+                        'repository': 'arvados',
+                        'script': 'crunchrunner',
+                        'runtime_constraints': {
+                            'docker_image': 'arvados/jobs:'+arvados_cwl.__version__,
+                            'min_cores_per_node': 1,
+                            'min_ram_mb_per_node': 1024,
+                            'min_scratch_mb_per_node': 2048 # tmpdirSize + outdirSize
+                        }
                     },
-                    'script_version': 'master',
-                    'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
-                    'repository': 'arvados',
-                    'script': 'crunchrunner',
-                    'runtime_constraints': {
-                        'docker_image': 'arvados/jobs',
-                        'min_cores_per_node': 1,
-                        'min_ram_mb_per_node': 1024,
-                        'min_scratch_mb_per_node': 2048 # tmpdirSize + outdirSize
-                    }
-                },
-                find_or_create=True,
-                filters=[['repository', '=', 'arvados'],
-                         ['script', '=', 'crunchrunner'],
-                         ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
-                         ['docker_image_locator', 'in docker', 'arvados/jobs']]
-            )
+                    find_or_create=enable_reuse,
+                    filters=[['repository', '=', 'arvados'],
+                             ['script', '=', 'crunchrunner'],
+                             ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
+                             ['docker_image_locator', 'in docker', 'arvados/jobs:'+arvados_cwl.__version__]]
+                )
 
     # The test passes some fields in builder.resources
     # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
-    def test_resource_requirements(self):
+    @mock.patch('arvados.commands.keepdocker.list_images_in_arv')
+    def test_resource_requirements(self, list_images_in_arv):
         runner = mock.MagicMock()
         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
         runner.ignore_docker_for_reuse = False
         runner.num_retries = 0
         arvados_cwl.add_arv_hints()
 
+        list_images_in_arv.return_value = [["zzzzz-4zz18-zzzzzzzzzzzzzzz"]]
+        runner.api.collections().get().execute.return_vaulue = {"portable_data_hash": "99999999999999999999999999999993+99"}
+
         document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
 
 
@@ -116,7 +128,7 @@ class TestJob(unittest.TestCase):
                 'repository': 'arvados',
                 'script': 'crunchrunner',
                 'runtime_constraints': {
-                    'docker_image': 'arvados/jobs',
+                    'docker_image': 'arvados/jobs:'+arvados_cwl.__version__,
                     'min_cores_per_node': 3,
                     'min_ram_mb_per_node': 3000,
                     'min_scratch_mb_per_node': 5024, # tmpdirSize + outdirSize
@@ -127,7 +139,7 @@ class TestJob(unittest.TestCase):
             filters=[['repository', '=', 'arvados'],
                      ['script', '=', 'crunchrunner'],
                      ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
-                     ['docker_image_locator', 'in docker', 'arvados/jobs']])
+                     ['docker_image_locator', 'in docker', 'arvados/jobs:'+arvados_cwl.__version__]])
 
     @mock.patch("arvados.collection.CollectionReader")
     def test_done(self, reader):
@@ -139,7 +151,11 @@ class TestJob(unittest.TestCase):
         runner.num_retries = 0
         runner.ignore_docker_for_reuse = False
 
-        reader().open.return_value = []
+        reader().open.return_value = StringIO.StringIO(
+            """2016-11-02_23:12:18 c97qk-8i9sb-cryqw2blvzy4yaj 13358 0 stderr 2016/11/02 23:12:18 crunchrunner: $(task.tmpdir)=/tmp/crunch-job-task-work/compute3.1/tmpdir
+2016-11-02_23:12:18 c97qk-8i9sb-cryqw2blvzy4yaj 13358 0 stderr 2016/11/02 23:12:18 crunchrunner: $(task.outdir)=/tmp/crunch-job-task-work/compute3.1/outdir
+2016-11-02_23:12:18 c97qk-8i9sb-cryqw2blvzy4yaj 13358 0 stderr 2016/11/02 23:12:18 crunchrunner: $(task.keep)=/keep
+        """)
         api.collections().list().execute.side_effect = ({"items": []},
                                                         {"items": [{"manifest_text": "XYZ"}]})
 
@@ -182,7 +198,12 @@ class TestJob(unittest.TestCase):
         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
         runner.num_retries = 0
 
-        reader().open.return_value = []
+        reader().open.return_value = StringIO.StringIO(
+            """2016-11-02_23:12:18 c97qk-8i9sb-cryqw2blvzy4yaj 13358 0 stderr 2016/11/02 23:12:18 crunchrunner: $(task.tmpdir)=/tmp/crunch-job-task-work/compute3.1/tmpdir
+2016-11-02_23:12:18 c97qk-8i9sb-cryqw2blvzy4yaj 13358 0 stderr 2016/11/02 23:12:18 crunchrunner: $(task.outdir)=/tmp/crunch-job-task-work/compute3.1/outdir
+2016-11-02_23:12:18 c97qk-8i9sb-cryqw2blvzy4yaj 13358 0 stderr 2016/11/02 23:12:18 crunchrunner: $(task.keep)=/keep
+        """)
+
         api.collections().list().execute.side_effect = ({"items": [{"uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz2"}]},)
 
         arvjob = arvados_cwl.ArvadosJob(runner)
@@ -212,63 +233,78 @@ class TestWorkflow(unittest.TestCase):
     # The test passes no builder.resources
     # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
     @mock.patch("arvados.collection.Collection")
-    def test_run(self, mockcollection):
-        try:
-            arvados_cwl.add_arv_hints()
+    @mock.patch('arvados.commands.keepdocker.list_images_in_arv')
+    def test_run(self, list_images_in_arv, mockcollection):
+        arvados_cwl.add_arv_hints()
 
-            runner = arvados_cwl.ArvCwlRunner(mock.MagicMock())
-            runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
-            runner.ignore_docker_for_reuse = False
-            runner.num_retries = 0
-            document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
+        api = mock.MagicMock()
+        api._rootDesc = get_rootDesc()
 
-            tool, metadata = document_loader.resolve_ref("tests/wf/scatter2.cwl")
-            metadata["cwlVersion"] = tool["cwlVersion"]
+        runner = arvados_cwl.ArvCwlRunner(api)
+        self.assertEqual(runner.work_api, 'jobs')
 
-            mockcollection().portable_data_hash.return_value = "99999999999999999999999999999999+118"
+        list_images_in_arv.return_value = [["zzzzz-4zz18-zzzzzzzzzzzzzzz"]]
+        runner.api.collections().get().execute.return_vaulue = {"portable_data_hash": "99999999999999999999999999999993+99"}
 
-            make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
-            arvtool = arvados_cwl.ArvadosWorkflow(runner, tool, work_api="jobs", avsc_names=avsc_names,
-                                                  basedir="", make_fs_access=make_fs_access, loader=document_loader,
-                                                  makeTool=runner.arv_make_tool, metadata=metadata)
-            arvtool.formatgraph = None
-            it = arvtool.job({}, mock.MagicMock(), basedir="", make_fs_access=make_fs_access)
-            it.next().run()
-            it.next().run()
-
-            with open("tests/wf/scatter2_subwf.cwl") as f:
-                subwf = f.read()
-
-            mockcollection().open().__enter__().write.assert_has_calls([mock.call(subwf)])
-            mockcollection().open().__enter__().write.assert_has_calls([mock.call('{sleeptime: 5}')])
-
-            runner.api.jobs().create.assert_called_with(
-                body={
-                    'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
-                    'repository': 'arvados',
-                    'script_version': 'master',
-                    'script': 'crunchrunner',
-                    'script_parameters': {
-                        'tasks': [{'task.env': {
-                            'HOME': '$(task.outdir)',
-                            'TMPDIR': '$(task.tmpdir)'},
-                                   'task.vwd': {
-                                       'workflow.cwl': '$(task.keep)/99999999999999999999999999999999+118/workflow.cwl',
-                                       'cwl.input.yml': '$(task.keep)/99999999999999999999999999999999+118/cwl.input.yml'
-                                   },
-                        'command': [u'cwltool', u'--no-container', u'--move-outputs', u'--preserve-entire-environment', u'workflow.cwl#main', u'cwl.input.yml'],
-                        'task.stdout': 'cwl.output.json'}]},
-                    'runtime_constraints': {
-                        'min_scratch_mb_per_node': 2048,
-                        'min_cores_per_node': 1,
-                        'docker_image': 'arvados/jobs',
-                        'min_ram_mb_per_node': 1024
-                    },
-                    'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'},
-                filters=[['repository', '=', 'arvados'],
-                         ['script', '=', 'crunchrunner'],
-                         ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
-                         ['docker_image_locator', 'in docker', 'arvados/jobs']],
-                find_or_create=True)
-        except:
-            logging.exception("")
+        runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
+        runner.ignore_docker_for_reuse = False
+        runner.num_retries = 0
+        document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0")
+
+        tool, metadata = document_loader.resolve_ref("tests/wf/scatter2.cwl")
+        metadata["cwlVersion"] = tool["cwlVersion"]
+
+        mockcollection().portable_data_hash.return_value = "99999999999999999999999999999999+118"
+
+        make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
+        arvtool = arvados_cwl.ArvadosWorkflow(runner, tool, work_api="jobs", avsc_names=avsc_names,
+                                              basedir="", make_fs_access=make_fs_access, loader=document_loader,
+                                              makeTool=runner.arv_make_tool, metadata=metadata)
+        arvtool.formatgraph = None
+        it = arvtool.job({}, mock.MagicMock(), basedir="", make_fs_access=make_fs_access)
+        it.next().run()
+        it.next().run()
+
+        with open("tests/wf/scatter2_subwf.cwl") as f:
+            subwf = f.read()
+
+        runner.api.jobs().create.assert_called_with(
+            body={
+                'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
+                'repository': 'arvados',
+                'script_version': 'master',
+                'script': 'crunchrunner',
+                'script_parameters': {
+                    'tasks': [{'task.env': {
+                        'HOME': '$(task.outdir)',
+                        'TMPDIR': '$(task.tmpdir)'},
+                               'task.vwd': {
+                                   'workflow.cwl': '$(task.keep)/99999999999999999999999999999999+118/workflow.cwl',
+                                   'cwl.input.yml': '$(task.keep)/99999999999999999999999999999999+118/cwl.input.yml'
+                               },
+                    'command': [u'cwltool', u'--no-container', u'--move-outputs', u'--preserve-entire-environment', u'workflow.cwl#main', u'cwl.input.yml'],
+                    'task.stdout': 'cwl.output.json'}]},
+                'runtime_constraints': {
+                    'min_scratch_mb_per_node': 2048,
+                    'min_cores_per_node': 1,
+                    'docker_image': 'arvados/jobs:'+arvados_cwl.__version__,
+                    'min_ram_mb_per_node': 1024
+                },
+                'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'},
+            filters=[['repository', '=', 'arvados'],
+                     ['script', '=', 'crunchrunner'],
+                     ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
+                     ['docker_image_locator', 'in docker', 'arvados/jobs:'+arvados_cwl.__version__]],
+            find_or_create=True)
+
+        mockcollection().open().__enter__().write.assert_has_calls([mock.call(subwf)])
+        mockcollection().open().__enter__().write.assert_has_calls([mock.call('{sleeptime: 5}')])
+
+    def test_default_work_api(self):
+        arvados_cwl.add_arv_hints()
+
+        api = mock.MagicMock()
+        api._rootDesc = copy.deepcopy(get_rootDesc())
+        del api._rootDesc.get('resources')['jobs']['methods']['create']
+        runner = arvados_cwl.ArvCwlRunner(api)
+        self.assertEqual(runner.work_api, 'containers')
index 267129715494b9f05bfe9a2df220e0514da5e81c..53f379f1a5ac0cc488af5157080e78933d543367 100644 (file)
@@ -1,20 +1,25 @@
+import functools
+import json
 import logging
 import mock
-import unittest
 import os
-import functools
-import json
 import StringIO
+import unittest
 
+import arvados
 import arvados_cwl
+from .mock_discovery import get_rootDesc
 
 class TestMakeOutput(unittest.TestCase):
+    def setUp(self):
+        self.api = mock.MagicMock()
+        self.api._rootDesc = get_rootDesc()
+
     @mock.patch("arvados.collection.Collection")
     @mock.patch("arvados.collection.CollectionReader")
     def test_make_output_collection(self, reader, col):
-        api = mock.MagicMock()
         keep_client = mock.MagicMock()
-        runner = arvados_cwl.ArvCwlRunner(api, keep_client=keep_client)
+        runner = arvados_cwl.ArvCwlRunner(self.api, keep_client=keep_client)
         runner.project_uuid = 'zzzzz-j7d0g-zzzzzzzzzzzzzzz'
 
         final = mock.MagicMock()
@@ -22,12 +27,15 @@ class TestMakeOutput(unittest.TestCase):
         readermock = mock.MagicMock()
         reader.return_value = readermock
 
+        final_uuid = final.manifest_locator()
+        num_retries = runner.num_retries
+
         cwlout = StringIO.StringIO()
         openmock = mock.MagicMock()
         final.open.return_value = openmock
         openmock.__enter__.return_value = cwlout
 
-        runner.make_output_collection("Test output", {
+        _, runner.final_output_collection = runner.make_output_collection("Test output", "tag0,tag1,tag2", {
             "foo": {
                 "class": "File",
                 "location": "keep:99999999999999999999999999999991+99/foo.txt",
@@ -37,7 +45,8 @@ class TestMakeOutput(unittest.TestCase):
             "bar": {
                 "class": "File",
                 "location": "keep:99999999999999999999999999999992+99/bar.txt",
-                "basename": "baz.txt"
+                "basename": "baz.txt",
+                "size": 4
             }
         })
 
@@ -47,12 +56,18 @@ class TestMakeOutput(unittest.TestCase):
         self.assertEqual("""{
     "bar": {
         "class": "File",
-        "location": "baz.txt"
+        "location": "baz.txt",
+        "size": 4
     },
     "foo": {
         "class": "File",
-        "location": "foo.txt"
+        "location": "foo.txt",
+        "size": 3
     }
 }""", cwlout.getvalue())
 
         self.assertIs(final, runner.final_output_collection)
+        self.assertIs(final_uuid, runner.final_output_collection.manifest_locator())
+        self.api.links().create.assert_has_calls([mock.call(body={"head_uuid": final_uuid, "link_class": "tag", "name": "tag0"}), mock.call().execute(num_retries=num_retries)])
+        self.api.links().create.assert_has_calls([mock.call(body={"head_uuid": final_uuid, "link_class": "tag", "name": "tag1"}), mock.call().execute(num_retries=num_retries)])
+        self.api.links().create.assert_has_calls([mock.call(body={"head_uuid": final_uuid, "link_class": "tag", "name": "tag2"}), mock.call().execute(num_retries=num_retries)])
diff --git a/sdk/cwl/tests/test_pathmapper.py b/sdk/cwl/tests/test_pathmapper.py
new file mode 100644 (file)
index 0000000..3b6af04
--- /dev/null
@@ -0,0 +1,96 @@
+import functools
+import mock
+import sys
+import unittest
+import json
+import logging
+import os
+
+import arvados
+import arvados.keep
+import arvados.collection
+import arvados_cwl
+
+from cwltool.pathmapper import MapperEnt
+from .mock_discovery import get_rootDesc
+
+from arvados_cwl.pathmapper import ArvPathMapper
+
+def upload_mock(files, api, dry_run=False, num_retries=0, project=None, fnPattern="$(file %s/%s)", name=None):
+    pdh = "99999999999999999999999999999991+99"
+    for c in files:
+        c.fn = fnPattern % (pdh, os.path.basename(c.fn))
+
+class TestPathmap(unittest.TestCase):
+    def setUp(self):
+        self.api = mock.MagicMock()
+        self.api._rootDesc = get_rootDesc()
+
+    def test_keepref(self):
+        """Test direct keep references."""
+
+        arvrunner = arvados_cwl.ArvCwlRunner(self.api)
+
+        p = ArvPathMapper(arvrunner, [{
+            "class": "File",
+            "location": "keep:99999999999999999999999999999991+99/hw.py"
+        }], "", "/test/%s", "/test/%s/%s")
+
+        self.assertEqual({'keep:99999999999999999999999999999991+99/hw.py': MapperEnt(resolved='keep:99999999999999999999999999999991+99/hw.py', target='/test/99999999999999999999999999999991+99/hw.py', type='File')},
+                         p._pathmap)
+
+    @mock.patch("arvados.commands.run.uploadfiles")
+    def test_upload(self, upl):
+        """Test pathmapper uploading files."""
+
+        arvrunner = arvados_cwl.ArvCwlRunner(self.api)
+
+        upl.side_effect = upload_mock
+
+        p = ArvPathMapper(arvrunner, [{
+            "class": "File",
+            "location": "tests/hw.py"
+        }], "", "/test/%s", "/test/%s/%s")
+
+        self.assertEqual({'tests/hw.py': MapperEnt(resolved='keep:99999999999999999999999999999991+99/hw.py', target='/test/99999999999999999999999999999991+99/hw.py', type='File')},
+                         p._pathmap)
+
+    @mock.patch("arvados.commands.run.uploadfiles")
+    def test_prev_uploaded(self, upl):
+        """Test pathmapper handling previously uploaded files."""
+
+        arvrunner = arvados_cwl.ArvCwlRunner(self.api)
+        arvrunner.add_uploaded('tests/hw.py', MapperEnt(resolved='keep:99999999999999999999999999999991+99/hw.py', target='', type='File'))
+
+        upl.side_effect = upload_mock
+
+        p = ArvPathMapper(arvrunner, [{
+            "class": "File",
+            "location": "tests/hw.py"
+        }], "", "/test/%s", "/test/%s/%s")
+
+        self.assertEqual({'tests/hw.py': MapperEnt(resolved='keep:99999999999999999999999999999991+99/hw.py', target='/test/99999999999999999999999999999991+99/hw.py', type='File')},
+                         p._pathmap)
+
+    @mock.patch("arvados.commands.run.uploadfiles")
+    @mock.patch("arvados.commands.run.statfile")
+    def test_statfile(self, statfile, upl):
+        """Test pathmapper handling ArvFile references."""
+        arvrunner = arvados_cwl.ArvCwlRunner(self.api)
+
+        # An ArvFile object returned from arvados.commands.run.statfile means the file is located on a
+        # keep mount, so we can construct a direct reference directly without upload.
+        def statfile_mock(prefix, fn, fnPattern="$(file %s/%s)", dirPattern="$(dir %s/%s/)"):
+            st = arvados.commands.run.ArvFile("", fnPattern % ("99999999999999999999999999999991+99", "hw.py"))
+            return st
+
+        upl.side_effect = upload_mock
+        statfile.side_effect = statfile_mock
+
+        p = ArvPathMapper(arvrunner, [{
+            "class": "File",
+            "location": "tests/hw.py"
+        }], "", "/test/%s", "/test/%s/%s")
+
+        self.assertEqual({'tests/hw.py': MapperEnt(resolved='keep:99999999999999999999999999999991+99/hw.py', target='/test/99999999999999999999999999999991+99/hw.py', type='File')},
+                         p._pathmap)
index 6674efb8c4f75c2391160a702588ea2354e377a3..c4b0ceab0e219856a5f3bdec125d3ce06bbb8921 100644 (file)
@@ -1,43 +1,52 @@
-import arvados
-import arvados.keep
-import arvados.collection
-import arvados_cwl
 import copy
 import cStringIO
 import functools
 import hashlib
+import json
+import logging
 import mock
 import sys
 import unittest
-import json
-import logging
+
+import arvados
+import arvados.collection
+import arvados_cwl
+import arvados_cwl.runner
+import arvados.keep
 
 from .matcher import JsonDiffMatcher
+from .mock_discovery import get_rootDesc
 
+_rootDesc = None
 
 def stubs(func):
     @functools.wraps(func)
     @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
     @mock.patch("arvados.collection.KeepClient")
+    @mock.patch("arvados.keep.KeepClient")
     @mock.patch("arvados.events.subscribe")
-    def wrapped(self, events, keep_client, keepdocker, *args, **kwargs):
+    def wrapped(self, events, keep_client1, keep_client2, keepdocker, *args, **kwargs):
         class Stubs:
             pass
         stubs = Stubs()
         stubs.events = events
         stubs.keepdocker = keepdocker
-        stubs.keep_client = keep_client
+
 
         def putstub(p, **kwargs):
             return "%s+%i" % (hashlib.md5(p).hexdigest(), len(p))
-        stubs.keep_client().put.side_effect = putstub
-        stubs.keep_client.put.side_effect = putstub
+        keep_client1().put.side_effect = putstub
+        keep_client1.put.side_effect = putstub
+        keep_client2().put.side_effect = putstub
+        keep_client2.put.side_effect = putstub
 
+        stubs.keep_client = keep_client2
         stubs.keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
         stubs.fake_user_uuid = "zzzzz-tpzed-zzzzzzzzzzzzzzz"
 
-
         stubs.api = mock.MagicMock()
+        stubs.api._rootDesc = get_rootDesc()
+
         stubs.api.users().current().execute.return_value = {
             "uuid": stubs.fake_user_uuid,
         }
@@ -60,7 +69,13 @@ def stubs(func):
             "uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz5",
             "portable_data_hash": "99999999999999999999999999999995+99",
             "manifest_text": ""
-        }        )
+        },
+        {
+            "uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz6",
+            "portable_data_hash": "99999999999999999999999999999996+99",
+            "manifest_text": ""
+        }
+        )
         stubs.api.collections().get().execute.return_value = {
             "portable_data_hash": "99999999999999999999999999999993+99", "manifest_text": "./tool 00000000000000000000000000000000+0 0:0:submit_tool.cwl 0:0:blub.txt"}
 
@@ -83,7 +98,7 @@ def stubs(func):
         }
         stubs.expect_job_spec = {
             'runtime_constraints': {
-                'docker_image': 'arvados/jobs'
+                'docker_image': 'arvados/jobs:'+arvados_cwl.__version__
             },
             'script_parameters': {
                 'x': {
@@ -109,9 +124,44 @@ def stubs(func):
                 '99999999999999999999999999999991+99/wf/submit_wf.cwl'
             },
             'repository': 'arvados',
-            'script_version': 'master',
+            'script_version': arvados_cwl.__version__,
             'script': 'cwl-runner'
         }
+        stubs.pipeline_component = stubs.expect_job_spec.copy()
+        stubs.expect_pipeline_instance = {
+            'name': 'submit_wf.cwl',
+            'state': 'RunningOnServer',
+            'owner_uuid': None,
+            "components": {
+                "cwl-runner": {
+                    'runtime_constraints': {'docker_image': 'arvados/jobs:'+arvados_cwl.__version__},
+                    'script_parameters': {
+                        'y': {"value": {'basename': '99999999999999999999999999999998+99', 'location': 'keep:99999999999999999999999999999998+99', 'class': 'Directory'}},
+                        'x': {"value": {'basename': 'blorp.txt', 'class': 'File', 'location': 'keep:99999999999999999999999999999994+99/blorp.txt'}},
+                        'z': {"value": {'basename': 'anonymous', 'class': 'Directory',
+                              'listing': [
+                                  {'basename': 'renamed.txt', 'class': 'File', 'location': 'keep:99999999999999999999999999999998+99/file1.txt'}
+                              ]}},
+                        'cwl:tool': '99999999999999999999999999999991+99/wf/submit_wf.cwl',
+                        'arv:enable_reuse': True
+                    },
+                    'repository': 'arvados',
+                    'script_version': arvados_cwl.__version__,
+                    'script': 'cwl-runner',
+                    'job': {'state': 'Queued', 'uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'}
+                }
+            }
+        }
+        stubs.pipeline_create = copy.deepcopy(stubs.expect_pipeline_instance)
+        stubs.expect_pipeline_uuid = "zzzzz-d1hrv-zzzzzzzzzzzzzzz"
+        stubs.pipeline_create["uuid"] = stubs.expect_pipeline_uuid
+        stubs.pipeline_with_job = copy.deepcopy(stubs.pipeline_create)
+        stubs.pipeline_with_job["components"]["cwl-runner"]["job"] = {
+            "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
+            "state": "Queued"
+        }
+        stubs.api.pipeline_instances().create().execute.return_value = stubs.pipeline_create
+        stubs.api.pipeline_instances().get().execute.return_value = stubs.pipeline_with_job
 
         stubs.expect_container_spec = {
             'priority': 1,
@@ -134,10 +184,10 @@ def stubs(func):
                 }
             },
             'state': 'Committed',
-            'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
-            'command': ['arvados-cwl-runner', '--local', '--api=containers', '/var/lib/cwl/workflow/submit_wf.cwl', '/var/lib/cwl/job/cwl.input.json'],
+            'owner_uuid': None,
+            'command': ['arvados-cwl-runner', '--local', '--api=containers', '--enable-reuse', '/var/lib/cwl/workflow/submit_wf.cwl', '/var/lib/cwl/job/cwl.input.json'],
             'name': 'submit_wf.cwl',
-            'container_image': '99999999999999999999999999999993+99',
+            'container_image': 'arvados/jobs:'+arvados_cwl.__version__,
             'output_path': '/var/spool/cwl',
             'cwd': '/var/spool/cwl',
             'runtime_constraints': {
@@ -151,17 +201,25 @@ def stubs(func):
         stubs.api.workflows().create().execute.return_value = {
             "uuid": stubs.expect_workflow_uuid,
         }
+        def update_mock(**kwargs):
+            stubs.updated_uuid = kwargs.get('uuid')
+            return mock.DEFAULT
+        stubs.api.workflows().update.side_effect = update_mock
+        stubs.api.workflows().update().execute.side_effect = lambda **kwargs: {
+            "uuid": stubs.updated_uuid,
+        }
 
         return func(self, stubs, *args, **kwargs)
     return wrapped
 
 
 class TestSubmit(unittest.TestCase):
+    @mock.patch("time.sleep")
     @stubs
-    def test_submit(self, stubs):
+    def test_submit(self, stubs, tm):
         capture_stdout = cStringIO.StringIO()
         exited = arvados_cwl.main(
-            ["--submit", "--no-wait",
+            ["--submit", "--no-wait", "--debug",
              "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
             capture_stdout, sys.stderr, api_client=stubs.api)
         self.assertEqual(exited, 0)
@@ -173,13 +231,12 @@ class TestSubmit(unittest.TestCase):
                 './tool d51232d96b6116d964a69bfb7e0c73bf+450 '
                 '0:16:blub.txt 16:434:submit_tool.cwl\n./wf '
                 'cc2ffb940e60adf1b2b282c67587e43d+413 0:413:submit_wf.cwl\n',
-                'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
+                'owner_uuid': None,
                 'name': 'submit_wf.cwl',
             }, ensure_unique_name=True),
             mock.call().execute(),
             mock.call(body={'manifest_text': '. d41d8cd98f00b204e9800998ecf8427e+0 '
                             '0:0:blub.txt 0:0:submit_tool.cwl\n',
-                            'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
                             'replication_desired': None,
                             'name': 'New collection'
             }, ensure_unique_name=True),
@@ -187,21 +244,79 @@ class TestSubmit(unittest.TestCase):
             mock.call(body={
                 'manifest_text':
                 '. 979af1245a12a1fed634d4222473bfdc+16 0:16:blorp.txt\n',
-                'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
+                'owner_uuid': None,
                 'name': '#',
             }, ensure_unique_name=True),
             mock.call().execute()])
 
-        expect_job = copy.deepcopy(stubs.expect_job_spec)
-        expect_job["owner_uuid"] = stubs.fake_user_uuid
-        stubs.api.jobs().create.assert_called_with(
-            body=expect_job,
-            find_or_create=True)
+        expect_pipeline = copy.deepcopy(stubs.expect_pipeline_instance)
+        stubs.api.pipeline_instances().create.assert_called_with(
+            body=expect_pipeline)
+        self.assertEqual(capture_stdout.getvalue(),
+                         stubs.expect_pipeline_uuid + '\n')
+
+
+    @mock.patch("time.sleep")
+    @stubs
+    def test_submit_no_reuse(self, stubs, tm):
+        capture_stdout = cStringIO.StringIO()
+        exited = arvados_cwl.main(
+            ["--submit", "--no-wait", "--debug", "--disable-reuse",
+             "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+            capture_stdout, sys.stderr, api_client=stubs.api)
+        self.assertEqual(exited, 0)
+
+        stubs.expect_pipeline_instance["components"]["cwl-runner"]["script_parameters"]["arv:enable_reuse"] = {"value": False}
+
+        expect_pipeline = copy.deepcopy(stubs.expect_pipeline_instance)
+        stubs.api.pipeline_instances().create.assert_called_with(
+            body=expect_pipeline)
         self.assertEqual(capture_stdout.getvalue(),
-                         stubs.expect_job_uuid + '\n')
+                         stubs.expect_pipeline_uuid + '\n')
 
+    @mock.patch("time.sleep")
     @stubs
-    def test_submit_with_project_uuid(self, stubs):
+    def test_submit_output_name(self, stubs, tm):
+        output_name = "test_output_name"
+
+        capture_stdout = cStringIO.StringIO()
+        exited = arvados_cwl.main(
+            ["--submit", "--no-wait", "--debug", "--output-name", output_name,
+             "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+            capture_stdout, sys.stderr, api_client=stubs.api)
+        self.assertEqual(exited, 0)
+
+        stubs.expect_pipeline_instance["components"]["cwl-runner"]["script_parameters"]["arv:output_name"] = output_name
+
+        expect_pipeline = copy.deepcopy(stubs.expect_pipeline_instance)
+        stubs.api.pipeline_instances().create.assert_called_with(
+            body=expect_pipeline)
+        self.assertEqual(capture_stdout.getvalue(),
+                         stubs.expect_pipeline_uuid + '\n')
+
+    @mock.patch("time.sleep")
+    @stubs
+    def test_submit_output_tags(self, stubs, tm):
+        output_tags = "tag0,tag1,tag2"
+
+        capture_stdout = cStringIO.StringIO()
+        exited = arvados_cwl.main(
+            ["--submit", "--no-wait", "--debug", "--output-tags", output_tags,
+             "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+            capture_stdout, sys.stderr, api_client=stubs.api)
+        self.assertEqual(exited, 0)
+
+        stubs.expect_pipeline_instance["components"]["cwl-runner"]["script_parameters"]["arv:output_tags"] = output_tags
+
+        expect_pipeline = copy.deepcopy(stubs.expect_pipeline_instance)
+        stubs.api.pipeline_instances().create.assert_called_with(
+            body=expect_pipeline)
+        self.assertEqual(capture_stdout.getvalue(),
+                         stubs.expect_pipeline_uuid + '\n')
+
+    @mock.patch("time.sleep")
+    @stubs
+    def test_submit_with_project_uuid(self, stubs, tm):
         project_uuid = 'zzzzz-j7d0g-zzzzzzzzzzzzzzz'
 
         exited = arvados_cwl.main(
@@ -211,11 +326,10 @@ class TestSubmit(unittest.TestCase):
             sys.stdout, sys.stderr, api_client=stubs.api)
         self.assertEqual(exited, 0)
 
-        expect_body = copy.deepcopy(stubs.expect_job_spec)
-        expect_body["owner_uuid"] = project_uuid
-        stubs.api.jobs().create.assert_called_with(
-            body=expect_body,
-            find_or_create=True)
+        expect_pipeline = copy.deepcopy(stubs.expect_pipeline_instance)
+        expect_pipeline["owner_uuid"] = project_uuid
+        stubs.api.pipeline_instances().create.assert_called_with(
+            body=expect_pipeline)
 
     @stubs
     def test_submit_container(self, stubs):
@@ -236,13 +350,12 @@ class TestSubmit(unittest.TestCase):
                 './tool d51232d96b6116d964a69bfb7e0c73bf+450 '
                 '0:16:blub.txt 16:434:submit_tool.cwl\n./wf '
                 'cc2ffb940e60adf1b2b282c67587e43d+413 0:413:submit_wf.cwl\n',
-                'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
+                'owner_uuid': None,
                 'name': 'submit_wf.cwl',
             }, ensure_unique_name=True),
             mock.call().execute(),
             mock.call(body={'manifest_text': '. d41d8cd98f00b204e9800998ecf8427e+0 '
                             '0:0:blub.txt 0:0:submit_tool.cwl\n',
-                            'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
                             'name': 'New collection',
                             'replication_desired': None,
             }, ensure_unique_name=True),
@@ -250,18 +363,123 @@ class TestSubmit(unittest.TestCase):
             mock.call(body={
                 'manifest_text':
                 '. 979af1245a12a1fed634d4222473bfdc+16 0:16:blorp.txt\n',
-                'owner_uuid': 'zzzzz-tpzed-zzzzzzzzzzzzzzz',
+                'owner_uuid': None,
                 'name': '#',
             }, ensure_unique_name=True),
             mock.call().execute()])
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
-        expect_container["owner_uuid"] = stubs.fake_user_uuid
         stubs.api.container_requests().create.assert_called_with(
             body=expect_container)
         self.assertEqual(capture_stdout.getvalue(),
                          stubs.expect_container_request_uuid + '\n')
 
+    @stubs
+    def test_submit_container_no_reuse(self, stubs):
+        capture_stdout = cStringIO.StringIO()
+        try:
+            exited = arvados_cwl.main(
+                ["--submit", "--no-wait", "--api=containers", "--debug", "--disable-reuse",
+                 "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+                capture_stdout, sys.stderr, api_client=stubs.api, keep_client=stubs.keep_client)
+            self.assertEqual(exited, 0)
+        except:
+            logging.exception("")
+
+        stubs.expect_container_spec["command"] = ['arvados-cwl-runner', '--local', '--api=containers', '--disable-reuse', '/var/lib/cwl/workflow/submit_wf.cwl', '/var/lib/cwl/job/cwl.input.json']
+
+        expect_container = copy.deepcopy(stubs.expect_container_spec)
+        stubs.api.container_requests().create.assert_called_with(
+            body=expect_container)
+        self.assertEqual(capture_stdout.getvalue(),
+                         stubs.expect_container_request_uuid + '\n')
+
+    @stubs
+    def test_submit_container_output_name(self, stubs):
+        output_name = "test_output_name"
+
+        capture_stdout = cStringIO.StringIO()
+        try:
+            exited = arvados_cwl.main(
+                ["--submit", "--no-wait", "--api=containers", "--debug", "--output-name", output_name,
+                 "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+                capture_stdout, sys.stderr, api_client=stubs.api, keep_client=stubs.keep_client)
+            self.assertEqual(exited, 0)
+        except:
+            logging.exception("")
+
+        stubs.expect_container_spec["command"] = ['arvados-cwl-runner', '--local', '--api=containers', "--output-name="+output_name, '--enable-reuse', '/var/lib/cwl/workflow/submit_wf.cwl', '/var/lib/cwl/job/cwl.input.json']
+
+        expect_container = copy.deepcopy(stubs.expect_container_spec)
+        stubs.api.container_requests().create.assert_called_with(
+            body=expect_container)
+        self.assertEqual(capture_stdout.getvalue(),
+                         stubs.expect_container_request_uuid + '\n')
+
+    @stubs
+    def test_submit_container_output_tags(self, stubs):
+        output_tags = "tag0,tag1,tag2"
+
+        capture_stdout = cStringIO.StringIO()
+        try:
+            exited = arvados_cwl.main(
+                ["--submit", "--no-wait", "--api=containers", "--debug", "--output-tags", output_tags,
+                 "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+                capture_stdout, sys.stderr, api_client=stubs.api, keep_client=stubs.keep_client)
+            self.assertEqual(exited, 0)
+        except:
+            logging.exception("")
+
+        stubs.expect_container_spec["command"] = ['arvados-cwl-runner', '--local', '--api=containers', "--output-tags="+output_tags, '--enable-reuse', '/var/lib/cwl/workflow/submit_wf.cwl', '/var/lib/cwl/job/cwl.input.json']
+
+        expect_container = copy.deepcopy(stubs.expect_container_spec)
+        stubs.api.container_requests().create.assert_called_with(
+            body=expect_container)
+        self.assertEqual(capture_stdout.getvalue(),
+                         stubs.expect_container_request_uuid + '\n')
+
+    @mock.patch("arvados.commands.keepdocker.find_one_image_hash")
+    @mock.patch("cwltool.docker.get_image")
+    @mock.patch("arvados.api")
+    def test_arvados_jobs_image(self, api, get_image, find_one_image_hash):
+        arvrunner = mock.MagicMock()
+        arvrunner.project_uuid = ""
+        api.return_value = mock.MagicMock()
+        arvrunner.api = api.return_value
+        arvrunner.api.links().list().execute.side_effect = ({"items": [], "items_available": 0, "offset": 0},
+                                                            {"items": [], "items_available": 0, "offset": 0},
+                                                            {"items": [], "items_available": 0, "offset": 0},
+                                                            {"items": [{"created_at": "",
+                                                                        "head_uuid": "",
+                                                                        "link_class": "docker_image_hash",
+                                                                        "name": "123456",
+                                                                        "owner_uuid": "",
+                                                                        "properties": {"image_timestamp": ""}}], "items_available": 1, "offset": 0},
+                                                            {"items": [], "items_available": 0, "offset": 0},
+                                                            {"items": [{"created_at": "",
+                                                                        "head_uuid": "",
+                                                                        "link_class": "docker_image_repo+tag",
+                                                                        "name": "arvados/jobs:"+arvados_cwl.__version__,
+                                                                        "owner_uuid": "",
+                                                                        "properties": {"image_timestamp": ""}}], "items_available": 1, "offset": 0},
+                                                            {"items": [{"created_at": "",
+                                                                        "head_uuid": "",
+                                                                        "link_class": "docker_image_hash",
+                                                                        "name": "123456",
+                                                                        "owner_uuid": "",
+                                                                        "properties": {"image_timestamp": ""}}], "items_available": 1, "offset": 0}                                                            ,
+        )
+        find_one_image_hash.return_value = "123456"
+
+        arvrunner.api.collections().list().execute.side_effect = ({"items": [], "items_available": 0, "offset": 0},
+                                                                  {"items": [{"uuid": "",
+                                                                              "owner_uuid": "",
+                                                                              "manifest_text": "",
+                                                                              "properties": ""
+                                                                          }], "items_available": 1, "offset": 0},
+                                                                  {"items": [{"uuid": ""}], "items_available": 1, "offset": 0})
+        arvrunner.api.collections().create().execute.return_value = {"uuid": ""}
+        self.assertEqual("arvados/jobs:"+arvados_cwl.__version__, arvados_cwl.runner.arvados_jobs_image(arvrunner))
 
 class TestCreateTemplate(unittest.TestCase):
     @stubs
@@ -271,7 +489,7 @@ class TestCreateTemplate(unittest.TestCase):
         capture_stdout = cStringIO.StringIO()
 
         exited = arvados_cwl.main(
-            ["--create-template", "--debug",
+            ["--create-workflow", "--debug",
              "--project-uuid", project_uuid,
              "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
             capture_stdout, sys.stderr, api_client=stubs.api)
@@ -313,6 +531,9 @@ class TestCreateTemplate(unittest.TestCase):
 
 
 class TestCreateWorkflow(unittest.TestCase):
+    existing_workflow_uuid = "zzzzz-7fd4e-validworkfloyml"
+    expect_workflow = open("tests/wf/expect_packed.cwl").read()
+
     @stubs
     def test_create(self, stubs):
         project_uuid = 'zzzzz-j7d0g-zzzzzzzzzzzzzzz'
@@ -321,6 +542,7 @@ class TestCreateWorkflow(unittest.TestCase):
 
         exited = arvados_cwl.main(
             ["--create-workflow", "--debug",
+             "--api=containers",
              "--project-uuid", project_uuid,
              "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
             capture_stdout, sys.stderr, api_client=stubs.api)
@@ -329,16 +551,13 @@ class TestCreateWorkflow(unittest.TestCase):
         stubs.api.pipeline_templates().create.refute_called()
         stubs.api.container_requests().create.refute_called()
 
-        with open("tests/wf/expect_packed.cwl") as f:
-            expect_workflow = f.read()
-
         body = {
             "workflow": {
                 "owner_uuid": project_uuid,
                 "name": "submit_wf.cwl",
                 "description": "",
-                "definition": expect_workflow
-                }
+                "definition": self.expect_workflow,
+            }
         }
         stubs.api.workflows().create.assert_called_with(
             body=JsonDiffMatcher(body))
@@ -346,13 +565,54 @@ class TestCreateWorkflow(unittest.TestCase):
         self.assertEqual(capture_stdout.getvalue(),
                          stubs.expect_workflow_uuid + '\n')
 
+    @stubs
+    def test_incompatible_api(self, stubs):
+        capture_stderr = cStringIO.StringIO()
+        logging.getLogger('arvados.cwl-runner').addHandler(
+            logging.StreamHandler(capture_stderr))
+
+        exited = arvados_cwl.main(
+            ["--update-workflow", self.existing_workflow_uuid,
+             "--api=jobs",
+             "--debug",
+             "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+            sys.stderr, sys.stderr, api_client=stubs.api)
+        self.assertEqual(exited, 1)
+        self.assertRegexpMatches(
+            capture_stderr.getvalue(),
+            "--update-workflow arg '{}' uses 'containers' API, but --api='jobs' specified".format(self.existing_workflow_uuid))
+
+    @stubs
+    def test_update(self, stubs):
+        capture_stdout = cStringIO.StringIO()
+
+        exited = arvados_cwl.main(
+            ["--update-workflow", self.existing_workflow_uuid,
+             "--debug",
+             "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+            capture_stdout, sys.stderr, api_client=stubs.api)
+        self.assertEqual(exited, 0)
+
+        body = {
+            "workflow": {
+                "name": "submit_wf.cwl",
+                "description": "",
+                "definition": self.expect_workflow,
+            }
+        }
+        stubs.api.workflows().update.assert_called_with(
+            uuid=self.existing_workflow_uuid,
+            body=JsonDiffMatcher(body))
+        self.assertEqual(capture_stdout.getvalue(),
+                         self.existing_workflow_uuid + '\n')
+
 
 class TestTemplateInputs(unittest.TestCase):
     expect_template = {
         "components": {
             "inputs_test.cwl": {
                 'runtime_constraints': {
-                    'docker_image': 'arvados/jobs',
+                    'docker_image': 'arvados/jobs:'+arvados_cwl.__version__,
                 },
                 'script_parameters': {
                     'cwl:tool':
@@ -387,7 +647,7 @@ class TestTemplateInputs(unittest.TestCase):
                     },
                 },
                 'repository': 'arvados',
-                'script_version': 'master',
+                'script_version': arvados_cwl.__version__,
                 'script': 'cwl-runner',
             },
         },
@@ -402,11 +662,8 @@ class TestTemplateInputs(unittest.TestCase):
             cStringIO.StringIO(), sys.stderr, api_client=stubs.api)
         self.assertEqual(exited, 0)
 
-        expect_template = copy.deepcopy(self.expect_template)
-        expect_template["owner_uuid"] = stubs.fake_user_uuid
-
         stubs.api.pipeline_templates().create.assert_called_with(
-            body=JsonDiffMatcher(expect_template), ensure_unique_name=True)
+            body=JsonDiffMatcher(self.expect_template), ensure_unique_name=True)
 
     @stubs
     def test_inputs(self, stubs):
@@ -416,10 +673,7 @@ class TestTemplateInputs(unittest.TestCase):
             cStringIO.StringIO(), sys.stderr, api_client=stubs.api)
         self.assertEqual(exited, 0)
 
-        self.expect_template["owner_uuid"] = stubs.fake_user_uuid
-
         expect_template = copy.deepcopy(self.expect_template)
-        expect_template["owner_uuid"] = stubs.fake_user_uuid
         params = expect_template[
             "components"]["inputs_test.cwl"]["script_parameters"]
         params["fileInput"]["value"] = '99999999999999999999999999999994+99/blorp.txt'
index e5050cb79c944673343878d559b75fd3e97807ae..61c14ea0b6c1d445bb2a26fb83a57614e0b240f9 100644 (file)
@@ -2,18 +2,19 @@ package arvados
 
 // Container is an arvados#container resource.
 type Container struct {
-       UUID               string             `json:"uuid"`
-       Command            []string           `json:"command"`
-       ContainerImage     string             `json:"container_image"`
-       Cwd                string             `json:"cwd"`
-       Environment        map[string]string  `json:"environment"`
-       LockedByUUID       string             `json:"locked_by_uuid"`
-       Mounts             map[string]Mount   `json:"mounts"`
-       Output             string             `json:"output"`
-       OutputPath         string             `json:"output_path"`
-       Priority           int                `json:"priority"`
-       RuntimeConstraints RuntimeConstraints `json:"runtime_constraints"`
-       State              ContainerState     `json:"state"`
+       UUID                 string               `json:"uuid"`
+       Command              []string             `json:"command"`
+       ContainerImage       string               `json:"container_image"`
+       Cwd                  string               `json:"cwd"`
+       Environment          map[string]string    `json:"environment"`
+       LockedByUUID         string               `json:"locked_by_uuid"`
+       Mounts               map[string]Mount     `json:"mounts"`
+       Output               string               `json:"output"`
+       OutputPath           string               `json:"output_path"`
+       Priority             int                  `json:"priority"`
+       RuntimeConstraints   RuntimeConstraints   `json:"runtime_constraints"`
+       State                ContainerState       `json:"state"`
+       SchedulingParameters SchedulingParameters `json:"scheduling_parameters"`
 }
 
 // Mount is special behavior to attach to a filesystem path or device.
@@ -30,10 +31,16 @@ type Mount struct {
 // RuntimeConstraints specify a container's compute resources (RAM,
 // CPU) and network connectivity.
 type RuntimeConstraints struct {
-       API       *bool
-       RAM       int      `json:"ram"`
-       VCPUs     int      `json:"vcpus"`
-       Partition []string `json:"partition"`
+       API          *bool
+       RAM          int `json:"ram"`
+       VCPUs        int `json:"vcpus"`
+       KeepCacheRAM int `json:"keep_cache_ram"`
+}
+
+// SchedulingParameters specify a container's scheduling parameters
+// such as Partitions
+type SchedulingParameters struct {
+       Partitions []string `json:"partitions"`
 }
 
 // ContainerList is an arvados#containerList resource.
index 7b87aee6ab7b14c875aa044e3b88e11ed22bd567..a64eaacf8347eb2d6937c84e2c1b0598994ce937 100644 (file)
@@ -28,6 +28,11 @@ func (d Duration) String() string {
        return time.Duration(d).String()
 }
 
+// Duration returns a time.Duration
+func (d Duration) Duration() time.Duration {
+       return time.Duration(d)
+}
+
 // Value implements flag.Value
 func (d *Duration) Set(s string) error {
        dur, err := time.ParseDuration(s)
index 2217dd3352eae69255b74b4faa5a74425efca0ee..a46ca4cc55aa5c3faa8ccdbe5b73339aacfa50ef 100644 (file)
@@ -36,15 +36,19 @@ Alternately, if you already have a filled buffer and just want to read out from
 package streamer
 
 import (
+       "errors"
        "io"
 )
 
+var ErrAlreadyClosed = errors.New("cannot close a stream twice")
+
 type AsyncStream struct {
        buffer            []byte
        requests          chan sliceRequest
        add_reader        chan bool
        subtract_reader   chan bool
        wait_zero_readers chan bool
+       closed            bool
 }
 
 // Reads from the buffer managed by the Transfer()
@@ -55,7 +59,13 @@ type StreamReader struct {
 }
 
 func AsyncStreamFromReader(buffersize int, source io.Reader) *AsyncStream {
-       t := &AsyncStream{make([]byte, buffersize), make(chan sliceRequest), make(chan bool), make(chan bool), make(chan bool)}
+       t := &AsyncStream{
+               buffer:            make([]byte, buffersize),
+               requests:          make(chan sliceRequest),
+               add_reader:        make(chan bool),
+               subtract_reader:   make(chan bool),
+               wait_zero_readers: make(chan bool),
+       }
 
        go t.transfer(source)
        go t.readersMonitor()
@@ -64,7 +74,13 @@ func AsyncStreamFromReader(buffersize int, source io.Reader) *AsyncStream {
 }
 
 func AsyncStreamFromSlice(buf []byte) *AsyncStream {
-       t := &AsyncStream{buf, make(chan sliceRequest), make(chan bool), make(chan bool), make(chan bool)}
+       t := &AsyncStream{
+               buffer:            buf,
+               requests:          make(chan sliceRequest),
+               add_reader:        make(chan bool),
+               subtract_reader:   make(chan bool),
+               wait_zero_readers: make(chan bool),
+       }
 
        go t.transfer(nil)
        go t.readersMonitor()
@@ -115,16 +131,24 @@ func (this *StreamReader) WriteTo(dest io.Writer) (written int64, err error) {
 
 // Close the responses channel
 func (this *StreamReader) Close() error {
+       if this.stream == nil {
+               return ErrAlreadyClosed
+       }
        this.stream.subtract_reader <- true
        close(this.responses)
        this.stream = nil
        return nil
 }
 
-func (this *AsyncStream) Close() {
+func (this *AsyncStream) Close() error {
+       if this.closed {
+               return ErrAlreadyClosed
+       }
+       this.closed = true
        this.wait_zero_readers <- true
        close(this.requests)
        close(this.add_reader)
        close(this.subtract_reader)
        close(this.wait_zero_readers)
+       return nil
 }
index 80aeb268975d8acbc7f7d1c2e771c17e7adfa719..f5333c37c175be1774eab5318824bb018f47f31f 100644 (file)
@@ -365,3 +365,13 @@ func (s *StandaloneSuite) TestManyReaders(c *C) {
        writer.Write([]byte("baz"))
        writer.Close()
 }
+
+func (s *StandaloneSuite) TestMultipleCloseNoPanic(c *C) {
+       buffer := make([]byte, 100)
+       tr := AsyncStreamFromSlice(buffer)
+       sr := tr.MakeStreamReader()
+       c.Check(sr.Close(), IsNil)
+       c.Check(sr.Close(), Equals, ErrAlreadyClosed)
+       c.Check(tr.Close(), IsNil)
+       c.Check(tr.Close(), Equals, ErrAlreadyClosed)
+}
index 1ca7ad82ed845844a2e18cc7bf4b7a9d24c3d652..610fd7dc1317b6f0a6af7672d148766dbf9ce961 100644 (file)
@@ -417,6 +417,8 @@ class _BlockManager(object):
         self.num_put_threads = _BlockManager.DEFAULT_PUT_THREADS
         self.num_get_threads = _BlockManager.DEFAULT_GET_THREADS
         self.copies = copies
+        self._pending_write_size = 0
+        self.threads_lock = threading.Lock()
 
     @synchronized
     def alloc_bufferblock(self, blockid=None, starting_capacity=2**14, owner=None):
@@ -482,28 +484,28 @@ class _BlockManager(object):
                 if self._put_queue is not None:
                     self._put_queue.task_done()
 
-    @synchronized
     def start_put_threads(self):
-        if self._put_threads is None:
-            # Start uploader threads.
-
-            # If we don't limit the Queue size, the upload queue can quickly
-            # grow to take up gigabytes of RAM if the writing process is
-            # generating data more quickly than it can be send to the Keep
-            # servers.
-            #
-            # With two upload threads and a queue size of 2, this means up to 4
-            # blocks pending.  If they are full 64 MiB blocks, that means up to
-            # 256 MiB of internal buffering, which is the same size as the
-            # default download block cache in KeepClient.
-            self._put_queue = Queue.Queue(maxsize=2)
-
-            self._put_threads = []
-            for i in xrange(0, self.num_put_threads):
-                thread = threading.Thread(target=self._commit_bufferblock_worker)
-                self._put_threads.append(thread)
-                thread.daemon = True
-                thread.start()
+        with self.threads_lock:
+            if self._put_threads is None:
+                # Start uploader threads.
+
+                # If we don't limit the Queue size, the upload queue can quickly
+                # grow to take up gigabytes of RAM if the writing process is
+                # generating data more quickly than it can be send to the Keep
+                # servers.
+                #
+                # With two upload threads and a queue size of 2, this means up to 4
+                # blocks pending.  If they are full 64 MiB blocks, that means up to
+                # 256 MiB of internal buffering, which is the same size as the
+                # default download block cache in KeepClient.
+                self._put_queue = Queue.Queue(maxsize=2)
+
+                self._put_threads = []
+                for i in xrange(0, self.num_put_threads):
+                    thread = threading.Thread(target=self._commit_bufferblock_worker)
+                    self._put_threads.append(thread)
+                    thread.daemon = True
+                    thread.start()
 
     def _block_prefetch_worker(self):
         """The background downloader thread."""
@@ -555,24 +557,34 @@ class _BlockManager(object):
         self.stop_threads()
 
     @synchronized
-    def repack_small_blocks(self, force=False, sync=False):
+    def repack_small_blocks(self, force=False, sync=False, closed_file_size=0):
         """Packs small blocks together before uploading"""
-        # Search blocks ready for getting packed together before being committed to Keep.
-        # A WRITABLE block always has an owner.
-        # A WRITABLE block with its owner.closed() implies that it's
-        # size is <= KEEP_BLOCK_SIZE/2.
-        small_blocks = [b for b in self._bufferblocks.values() if b.state() == _BufferBlock.WRITABLE and b.owner.closed()]
-        if len(small_blocks) <= 1:
-            # Not enough small blocks for repacking
-            return
+        self._pending_write_size += closed_file_size
 
         # Check if there are enough small blocks for filling up one in full
-        pending_write_size = sum([b.size() for b in small_blocks])
-        if force or (pending_write_size >= config.KEEP_BLOCK_SIZE):
+        if force or (self._pending_write_size >= config.KEEP_BLOCK_SIZE):
+
+            # Search blocks ready for getting packed together before being committed to Keep.
+            # A WRITABLE block always has an owner.
+            # A WRITABLE block with its owner.closed() implies that it's
+            # size is <= KEEP_BLOCK_SIZE/2.
+            small_blocks = [b for b in self._bufferblocks.values() if b.state() == _BufferBlock.WRITABLE and b.owner.closed()]
+
+            if len(small_blocks) <= 1:
+                # Not enough small blocks for repacking
+                return
+
+            # Update the pending write size count with its true value, just in case
+            # some small file was opened, written and closed several times.
+            self._pending_write_size = sum([b.size() for b in small_blocks])
+            if self._pending_write_size < config.KEEP_BLOCK_SIZE and not force:
+                return
+
             new_bb = self._alloc_bufferblock()
             while len(small_blocks) > 0 and (new_bb.write_pointer + small_blocks[0].size()) <= config.KEEP_BLOCK_SIZE:
                 bb = small_blocks.pop(0)
                 arvfile = bb.owner
+                self._pending_write_size -= bb.size()
                 new_bb.append(bb.buffer_view[0:bb.write_pointer].tobytes())
                 arvfile.set_segments([Range(new_bb.blockid,
                                             0,
@@ -834,19 +846,19 @@ class ArvadosFile(object):
             self._writers.add(writer)
 
     @synchronized
-    def remove_writer(self, writer):
+    def remove_writer(self, writer, flush):
         """
         Called from ArvadosFileWriter.close(). Remove a writer reference from the list
         and do some block maintenance tasks.
         """
         self._writers.remove(writer)
 
-        if self.size() > config.KEEP_BLOCK_SIZE / 2:
+        if flush or self.size() > config.KEEP_BLOCK_SIZE / 2:
             # File writer closed, not small enough for repacking
             self.flush()
         elif self.closed():
             # All writers closed and size is adequate for repacking
-            self.parent._my_block_manager().repack_small_blocks()
+            self.parent._my_block_manager().repack_small_blocks(closed_file_size=self.size())
 
     def closed(self):
         """
@@ -1166,7 +1178,7 @@ class ArvadosFileWriter(ArvadosFileReader):
     def flush(self):
         self.arvadosfile.flush()
 
-    def close(self):
+    def close(self, flush=True):
         if not self.closed:
-            self.arvadosfile.remove_writer(self)
+            self.arvadosfile.remove_writer(self, flush)
             super(ArvadosFileWriter, self).close()
index 89753a22863808c3fb89686cbf9948dae8760171..34cef6725500e6cb5cd12ec317aa1be8eeb4bd80 100644 (file)
@@ -290,7 +290,7 @@ class ArvPutUploadJob(object):
     def __init__(self, paths, resume=True, reporter=None, bytes_expected=None,
                  name=None, owner_uuid=None, ensure_unique_name=False,
                  num_retries=None, replication_desired=None,
-                 filename=None, update_time=60.0):
+                 filename=None, update_time=1.0):
         self.paths = paths
         self.resume = resume
         self.reporter = reporter
@@ -391,8 +391,7 @@ class ArvPutUploadJob(object):
                 with self._state_lock:
                     # Get the manifest text without comitting pending blocks
                     self._state['manifest'] = self._my_collection()._get_manifest_text(".", strip=False, normalize=False, only_committed=True)
-        if self.resume:
-            self._save_state()
+                self._save_state()
         # Call the reporter, if any
         self.report_progress()
 
@@ -472,7 +471,7 @@ class ArvPutUploadJob(object):
                 with self._collection_lock:
                     output = self._my_collection().open(filename, 'w')
             self._write(source_fd, output)
-            output.close()
+            output.close(flush=False)
 
     def _write(self, source_fd, output):
         first_read = True
index a1b46384394d84ad6b68e5c6971cc890823a9d12..cf26f9e8addb7b6e45e2af87a2504947878c7c6c 100644 (file)
@@ -155,39 +155,66 @@ class PollClient(threading.Thread):
         self._closing_lock = threading.RLock()
 
     def run(self):
-        self.id = 0
         if self.last_log_id != None:
-            self.id = self.last_log_id
+            # Caller supplied the last-seen event ID from a previous
+            # connection
+            skip_old_events = [["id", ">", str(self.last_log_id)]]
         else:
-            for f in self.filters:
-                for tries_left in RetryLoop(num_retries=25, backoff_start=.1, max_wait=self.poll_time):
-                    try:
-                        items = self.api.logs().list(limit=1, order="id desc", filters=f).execute()['items']
-                        break
-                    except errors.ApiError as error:
-                        pass
-                    else:
-                        tries_left = 0
-                        break
-                if tries_left == 0:
-                    _logger.exception("PollClient thread could not contact API server.")
-                    with self._closing_lock:
-                        self._closing.set()
-                    thread.interrupt_main()
-                    return
-                if items:
-                    if items[0]['id'] > self.id:
-                        self.id = items[0]['id']
+            # We need to do a reverse-order query to find the most
+            # recent event ID (see "if not skip_old_events" below).
+            skip_old_events = False
 
         self.on_event({'status': 200})
 
         while not self._closing.is_set():
-            max_id = self.id
             moreitems = False
             for f in self.filters:
                 for tries_left in RetryLoop(num_retries=25, backoff_start=.1, max_wait=self.poll_time):
                     try:
-                        items = self.api.logs().list(order="id asc", filters=f+[["id", ">", str(self.id)]]).execute()
+                        if not skip_old_events:
+                            # If the caller didn't provide a known
+                            # recent ID, our first request will ask
+                            # for the single most recent event from
+                            # the last 2 hours (the time restriction
+                            # avoids doing an expensive database
+                            # query, and leaves a big enough margin to
+                            # account for clock skew). If we do find a
+                            # recent event, we remember its ID but
+                            # then discard it (we are supposed to be
+                            # returning new/current events, not old
+                            # ones).
+                            #
+                            # Subsequent requests will get multiple
+                            # events in chronological order, and
+                            # filter on that same cutoff time, or
+                            # (once we see our first matching event)
+                            # the ID of the last-seen event.
+                            skip_old_events = [[
+                                "created_at", ">=",
+                                time.strftime(
+                                    "%Y-%m-%dT%H:%M:%SZ",
+                                    time.gmtime(time.time()-7200))]]
+                            items = self.api.logs().list(
+                                order="id desc",
+                                limit=1,
+                                filters=f+skip_old_events).execute()
+                            if items["items"]:
+                                skip_old_events = [
+                                    ["id", ">", str(items["items"][0]["id"])]]
+                                items = {
+                                    "items": [],
+                                    "items_available": 0,
+                                }
+                        else:
+                            # In this case, either we know the most
+                            # recent matching ID, or we know there
+                            # were no matching events in the 2-hour
+                            # window before subscribing. Either way we
+                            # can safely ask for events in ascending
+                            # order.
+                            items = self.api.logs().list(
+                                order="id asc",
+                                filters=f+skip_old_events).execute()
                         break
                     except errors.ApiError as error:
                         pass
@@ -201,8 +228,7 @@ class PollClient(threading.Thread):
                     thread.interrupt_main()
                     return
                 for i in items["items"]:
-                    if i['id'] > max_id:
-                        max_id = i['id']
+                    skip_old_events = [["id", ">", str(i["id"])]]
                     with self._closing_lock:
                         if self._closing.is_set():
                             return
@@ -213,7 +239,6 @@ class PollClient(threading.Thread):
                             thread.interrupt_main()
                 if items["items_available"] > len(items["items"]):
                     moreitems = True
-            self.id = max_id
             if not moreitems:
                 self._closing.wait(self.poll_time)
 
index e72f67dce49049f37c9b2e68794eb62cc780297c..642b7ccbad51846a9f1c25acc86f6b0505897c62 100644 (file)
@@ -394,8 +394,7 @@ def run_keep(blob_signing_key=None, enforce_permissions=False, num_servers=2):
     with open(os.path.join(TEST_TMPDIR, "keep.blob_signing_key"), "w") as f:
         keep_args['-blob-signing-key-file'] = f.name
         f.write(blob_signing_key)
-    if enforce_permissions:
-        keep_args['-enforce-permissions'] = 'true'
+    keep_args['-enforce-permissions'] = str(enforce_permissions).lower()
     with open(os.path.join(TEST_TMPDIR, "keep.data-manager-token-file"), "w") as f:
         keep_args['-data-manager-token-file'] = f.name
         f.write(auth_token('data_manager'))
index 8d3e9d62a1c32cf15c17fa3e264c58d19cd6f9ee..fc30a242eba1bfc665a05747de66f999869ef8a4 100644 (file)
@@ -1110,13 +1110,16 @@ class NewCollectionTestCaseWithServers(run_test_server.TestCaseWithServers):
     def test_only_small_blocks_are_packed_together(self):
         c = Collection()
         # Write a couple of small files, 
-        with c.open("count.txt", "w") as f:
-            f.write("0123456789")
-        with c.open("foo.txt", "w") as foo:
-            foo.write("foo")
+        f = c.open("count.txt", "w")
+        f.write("0123456789")
+        f.close(flush=False)
+        foo = c.open("foo.txt", "w")
+        foo.write("foo")
+        foo.close(flush=False)
         # Then, write a big file, it shouldn't be packed with the ones above
-        with c.open("bigfile.txt", "w") as big:
-            big.write("x" * 1024 * 1024 * 33) # 33 MB > KEEP_BLOCK_SIZE/2
+        big = c.open("bigfile.txt", "w")
+        big.write("x" * 1024 * 1024 * 33) # 33 MB > KEEP_BLOCK_SIZE/2
+        big.close(flush=False)
         self.assertEqual(
             c.manifest_text("."),
             '. 2d303c138c118af809f39319e5d507e9+34603008 a8430a058b8fbf408e1931b794dbd6fb+13 0:34603008:bigfile.txt 34603008:10:count.txt 34603018:3:foo.txt\n')
index dfaa07049bd31e818f5ca5231e455545c5488145..7be039e8a304aea0d6248d5151d969562dab1471 100644 (file)
@@ -74,7 +74,7 @@ gem 'faye-websocket'
 gem 'themes_for_rails'
 
 gem 'arvados', '>= 0.1.20150615153458'
-gem 'arvados-cli', '>= 0.1.20151207150126'
+gem 'arvados-cli', '>= 0.1.20161017193526'
 
 # pg_power lets us use partial indexes in schema.rb in Rails 3
 gem 'pg_power'
index d9edcc64fa4ee48e455e4ad17dff6ac3821b5172..3e551a0c3fab6d425de31b8f3354ba7f1474edfe 100644 (file)
@@ -42,7 +42,7 @@ GEM
       i18n (~> 0)
       json (~> 1.7, >= 1.7.7)
       jwt (>= 0.1.5, < 2)
-    arvados-cli (0.1.20160913140509)
+    arvados-cli (0.1.20161017193526)
       activesupport (~> 3.2, >= 3.2.13)
       andand (~> 1.3, >= 1.3.3)
       arvados (~> 0.1, >= 0.1.20150128223554)
@@ -258,8 +258,8 @@ DEPENDENCIES
   acts_as_api
   andand
   arvados (>= 0.1.20150615153458)
-  arvados-cli (>= 0.1.20151207150126)
-  coffee-rails (~> 3.2)
+  arvados-cli (>= 0.1.20161017193526)
+  coffee-rails (~> 3.2.0)
   database_cleaner
   factory_girl_rails
   faye-websocket
index 6229b4971888168a1308feb18a00529d50795bd7..4e3b5b8fd860926969db22fb2b946119e65a8f89 100644 (file)
@@ -25,6 +25,7 @@ class ApplicationController < ActionController::Base
 
   ERROR_ACTIONS = [:render_error, :render_not_found]
 
+  before_filter :disable_api_methods
   before_filter :set_cors_headers
   before_filter :respond_with_json_by_default
   before_filter :remote_ip
@@ -397,6 +398,13 @@ class ApplicationController < ActionController::Base
     end
   end
 
+  def disable_api_methods
+    if Rails.configuration.disable_api_methods.
+        include?(controller_name + "." + action_name)
+      send_error("Disabled", status: 404)
+    end
+  end
+
   def set_cors_headers
     response.headers['Access-Control-Allow-Origin'] = '*'
     response.headers['Access-Control-Allow-Methods'] = 'GET, HEAD, PUT, POST, DELETE'
index 44733cdfb82ff1c21c4ca379a723110ebcaf5721..922cf7dac16b87741013c23e4073d4070a6fbe43 100644 (file)
@@ -182,10 +182,10 @@ class Arvados::V1::CollectionsController < ApplicationController
   protected
 
   def load_limit_offset_order_params *args
+    super
     if action_name == 'index'
       # Omit manifest_text from index results unless expressly selected.
       @select ||= model_class.selectable_attributes - ["manifest_text"]
     end
-    super
   end
 end
index 6e2848ceb53f34165379e3f1afa539d67dbb5651..ed04a4ba8f71c148d424db545c5d9bd7ddc69a7c 100644 (file)
@@ -4,4 +4,5 @@ class Arvados::V1::ContainerRequestsController < ApplicationController
   accept_attribute_as_json :runtime_constraints, Hash
   accept_attribute_as_json :command, Array
   accept_attribute_as_json :filters, Array
+  accept_attribute_as_json :scheduling_parameters, Hash
 end
index fb748e9350d01273fbd09f6709a733815b745d78..51f15ad84fd94c7c7834e952a14f5d75d6deaf04 100644 (file)
@@ -3,6 +3,10 @@ class Arvados::V1::ContainersController < ApplicationController
   accept_attribute_as_json :mounts, Hash
   accept_attribute_as_json :runtime_constraints, Hash
   accept_attribute_as_json :command, Array
+  accept_attribute_as_json :scheduling_parameters, Hash
+
+  skip_before_filter :find_object_by_uuid, only: [:current]
+  skip_before_filter :render_404_if_no_object, only: [:current]
 
   def auth
     if @object.locked_by_uuid != Thread.current[:api_client_authorization].uuid
@@ -29,4 +33,18 @@ class Arvados::V1::ContainersController < ApplicationController
     @object.unlock
     show
   end
+
+  def current
+    if Thread.current[:api_client_authorization].nil?
+      send_error("Not logged in", status: 401)
+    else
+      c = Container.where(auth_uuid: Thread.current[:api_client_authorization].uuid).first
+      if c.nil?
+        send_error("Token is not associated with a container.", status: 404)
+      else
+        @object = c
+        show
+      end
+    end
+  end
 end
index 7a5713a03c59651a3bc0050674ea38171d8f9c34..d6adbf08516a7c2c199cb240017b5e64ede195be 100644 (file)
@@ -75,7 +75,20 @@ class Arvados::V1::GroupsController < ApplicationController
       end
     end
 
+    wanted_klasses = []
+    request_filters.each do |col,op,val|
+      if op == 'is_a'
+        (val.is_a?(Array) ? val : [val]).each do |type|
+          type = type.split('#')[-1]
+          type[0] = type[0].capitalize
+          wanted_klasses << type
+        end
+      end
+    end
+
     klasses.each do |klass|
+      next if wanted_klasses.any? and !wanted_klasses.include?(klass.to_s)
+
       # If the currently requested orders specifically match the
       # table_name for the current klass, apply that order.
       # Otherwise, order by recency.
index ba0f90f90c45d95925df0ae7892815d0b5c490b6..2c55b15068ca3e8e1a2046b44d20dc4fa86ba32e 100644 (file)
@@ -399,6 +399,10 @@ class Arvados::V1::SchemaController < ApplicationController
           end
         end
       end
+      Rails.configuration.disable_api_methods.each do |method|
+        ctrl, action = method.split('.', 2)
+        discovery[:resources][ctrl][:methods].delete(action.to_sym)
+      end
       discovery
     end
     send_json discovery
index 795b114bf91930447fd777686015ef97ce001a49..8bb27a705e7fdeba37b224ddbb405183f51dccc4 100644 (file)
@@ -45,6 +45,9 @@ class UserSessionsController < ApplicationController
                       :identity_url => omniauth['info']['identity_url'],
                       :is_active => Rails.configuration.new_users_are_active,
                       :owner_uuid => system_user_uuid)
+      if omniauth['info']['username']
+        user.set_initial_username(requested: omniauth['info']['username'])
+      end
       act_as_system_user do
         user.save or raise Exception.new(user.errors.messages)
       end
index fe6833c431b7f7613515cdc1c0b254c1358872ef..aed0309591e4ecbfa4c309747daee695417b16c8 100644 (file)
@@ -635,7 +635,7 @@ class ArvadosModel < ActiveRecord::Base
   end
 
   def log_destroy
-    log_change('destroy') do |log|
+    log_change('delete') do |log|
       log.fill_properties('old', etag(@old_attributes), @old_logged_attributes)
       log.update_to nil
     end
index 1c3a29a7c30756e162e201d9237e976a5ea0c133..901084c7636a61496944b4c18616e2d79c3508e5 100644 (file)
@@ -321,7 +321,7 @@ class Collection < ArvadosModel
         # looks like a saved Docker image.
         manifest = Keep::Manifest.new(coll_match.manifest_text)
         if manifest.exact_file_count?(1) and
-            (manifest.files[0][1] =~ /^[0-9A-Fa-f]{64}\.tar$/)
+            (manifest.files[0][1] =~ /^(sha256:)?[0-9A-Fa-f]{64}\.tar$/)
           return [coll_match]
         end
       end
index 43c5b30a1f603fd94b828b3449f71c01b5ba716a..52f1cba723ed5744af3bf226265f9bb600d4f61f 100644 (file)
@@ -11,6 +11,7 @@ class Container < ArvadosModel
   serialize :mounts, Hash
   serialize :runtime_constraints, Hash
   serialize :command, Array
+  serialize :scheduling_parameters, Hash
 
   before_validation :fill_field_defaults, :if => :new_record?
   before_validation :set_timestamps
@@ -18,6 +19,7 @@ class Container < ArvadosModel
   validate :validate_state_change
   validate :validate_change
   validate :validate_lock
+  validate :validate_output
   after_validation :assign_auth
   before_save :sort_serialized_attrs
   after_save :handle_completed
@@ -43,6 +45,7 @@ class Container < ArvadosModel
     t.add :started_at
     t.add :state
     t.add :auth_uuid
+    t.add :scheduling_parameters
   end
 
   # Supported states for a container
@@ -166,6 +169,10 @@ class Container < ArvadosModel
             uuids: uuid_list)
   end
 
+  def final?
+    [Complete, Cancelled].include?(self.state)
+  end
+
   protected
 
   def fill_field_defaults
@@ -175,6 +182,7 @@ class Container < ArvadosModel
     self.mounts ||= {}
     self.cwd ||= "."
     self.priority ||= 1
+    self.scheduling_parameters ||= {}
   end
 
   def permission_to_create
@@ -182,7 +190,23 @@ class Container < ArvadosModel
   end
 
   def permission_to_update
-    current_user.andand.is_admin
+    # Override base permission check to allow auth_uuid to set progress and
+    # output (only).  Whether it is legal to set progress and output in the current
+    # state has already been checked in validate_change.
+    current_user.andand.is_admin ||
+      (!current_api_client_authorization.nil? and
+       [self.auth_uuid, self.locked_by_uuid].include? current_api_client_authorization.uuid)
+  end
+
+  def ensure_owner_uuid_is_permitted
+    # Override base permission check to allow auth_uuid to set progress and
+    # output (only).  Whether it is legal to set progress and output in the current
+    # state has already been checked in validate_change.
+    if !current_api_client_authorization.nil? and self.auth_uuid == current_api_client_authorization.uuid
+      check_update_whitelist [:progress, :output]
+    else
+      super
+    end
   end
 
   def set_timestamps
@@ -201,7 +225,7 @@ class Container < ArvadosModel
     if self.new_record?
       permitted.push(:owner_uuid, :command, :container_image, :cwd,
                      :environment, :mounts, :output_path, :priority,
-                     :runtime_constraints)
+                     :runtime_constraints, :scheduling_parameters)
     end
 
     case self.state
@@ -209,7 +233,7 @@ class Container < ArvadosModel
       permitted.push :priority
 
     when Running
-      permitted.push :priority, :progress
+      permitted.push :priority, :progress, :output
       if self.state_changed?
         permitted.push :started_at
       end
@@ -236,20 +260,10 @@ class Container < ArvadosModel
   end
 
   def validate_lock
-    # If the Container is already locked by someone other than the
-    # current api_client_auth, disallow all changes -- except
-    # priority, which needs to change to reflect max(priority) of
-    # relevant ContainerRequests.
-    if locked_by_uuid_was
-      if locked_by_uuid_was != Thread.current[:api_client_authorization].uuid
-        check_update_whitelist [:priority]
-      end
-    end
-
     if [Locked, Running].include? self.state
       # If the Container was already locked, locked_by_uuid must not
       # changes. Otherwise, the current auth gets the lock.
-      need_lock = locked_by_uuid_was || Thread.current[:api_client_authorization].uuid
+      need_lock = locked_by_uuid_was || current_api_client_authorization.andand.uuid
     else
       need_lock = nil
     end
@@ -265,6 +279,21 @@ class Container < ArvadosModel
     self.locked_by_uuid = need_lock
   end
 
+  def validate_output
+    # Output must exist and be readable by the current user.  This is so
+    # that a container cannot "claim" a collection that it doesn't otherwise
+    # have access to just by setting the output field to the collection PDH.
+    if output_changed?
+      c = Collection.
+          readable_by(current_user).
+          where(portable_data_hash: self.output).
+          first
+      if !c
+        errors.add :output, "collection must exist and be readable by current user."
+      end
+    end
+  end
+
   def assign_auth
     if self.auth_uuid_changed?
       return errors.add :auth_uuid, 'is readonly'
@@ -300,12 +329,15 @@ class Container < ArvadosModel
     if self.runtime_constraints_changed?
       self.runtime_constraints = self.class.deep_sort_hash(self.runtime_constraints)
     end
+    if self.scheduling_parameters_changed?
+      self.scheduling_parameters = self.class.deep_sort_hash(self.scheduling_parameters)
+    end
   end
 
   def handle_completed
     # This container is finished so finalize any associated container requests
     # that are associated with this container.
-    if self.state_changed? and [Complete, Cancelled].include? self.state
+    if self.state_changed? and self.final?
       act_as_system_user do
 
         if self.state == Cancelled
@@ -322,7 +354,8 @@ class Container < ArvadosModel
             output_path: self.output_path,
             container_image: self.container_image,
             mounts: self.mounts,
-            runtime_constraints: self.runtime_constraints
+            runtime_constraints: self.runtime_constraints,
+            scheduling_parameters: self.scheduling_parameters
           }
           c = Container.create! c_attrs
           retryable_requests.each do |cr|
@@ -337,7 +370,7 @@ class Container < ArvadosModel
         # Notify container requests associated with this container
         ContainerRequest.where(container_uuid: uuid,
                                state: ContainerRequest::Committed).each do |cr|
-          cr.container_completed!
+          cr.finalize!
         end
 
         # Try to cancel any outstanding container requests made by this container.
index a588c86451a88c2205472ba2dcc19eaff3dd15d3..f92fa21314824b4118ac8f725470fee2bee41ea6 100644 (file)
@@ -11,14 +11,17 @@ class ContainerRequest < ArvadosModel
   serialize :mounts, Hash
   serialize :runtime_constraints, Hash
   serialize :command, Array
+  serialize :scheduling_parameters, Hash
 
   before_validation :fill_field_defaults, :if => :new_record?
+  before_validation :validate_runtime_constraints
+  before_validation :validate_scheduling_parameters
   before_validation :set_container
   validates :command, :container_image, :output_path, :cwd, :presence => true
   validate :validate_state_change
   validate :validate_change
-  validate :validate_runtime_constraints
   after_save :update_priority
+  after_save :finalize_if_needed
   before_create :set_requesting_container_uuid
 
   api_accessible :user, extend: :common do |t|
@@ -40,6 +43,10 @@ class ContainerRequest < ArvadosModel
     t.add :requesting_container_uuid
     t.add :runtime_constraints
     t.add :state
+    t.add :use_existing
+    t.add :output_uuid
+    t.add :log_uuid
+    t.add :scheduling_parameters
   end
 
   # Supported states for a container request
@@ -65,16 +72,26 @@ class ContainerRequest < ArvadosModel
     %w(modified_by_client_uuid container_uuid requesting_container_uuid)
   end
 
+  def finalize_if_needed
+    if state == Committed && Container.find_by_uuid(container_uuid).final?
+      reload
+      act_as_system_user do
+        finalize!
+      end
+    end
+  end
+
   # Finalize the container request after the container has
   # finished/cancelled.
-  def container_completed!
-    update_attributes!(state: ContainerRequest::Final)
+  def finalize!
+    out_coll = nil
+    log_coll = nil
     c = Container.find_by_uuid(container_uuid)
     ['output', 'log'].each do |out_type|
       pdh = c.send(out_type)
       next if pdh.nil?
       manifest = Collection.where(portable_data_hash: pdh).first.manifest_text
-      Collection.create!(owner_uuid: owner_uuid,
+      coll = Collection.create!(owner_uuid: owner_uuid,
                          manifest_text: manifest,
                          portable_data_hash: pdh,
                          name: "Container #{out_type} for request #{uuid}",
@@ -82,7 +99,13 @@ class ContainerRequest < ArvadosModel
                            'type' => out_type,
                            'container_request' => uuid,
                          })
+      if out_type == 'output'
+        out_coll = coll.uuid
+      else
+        log_coll = coll.uuid
+      end
     end
+    update_attributes!(state: Final, output_uuid: out_coll, log_uuid: log_coll)
   end
 
   protected
@@ -94,6 +117,7 @@ class ContainerRequest < ArvadosModel
     self.mounts ||= {}
     self.cwd ||= "."
     self.container_count_max ||= Rails.configuration.container_count_max
+    self.scheduling_parameters ||= {}
   end
 
   # Create a new container (or find an existing one) to satisfy this
@@ -110,10 +134,12 @@ class ContainerRequest < ArvadosModel
                  container_image: c_container_image,
                  mounts: c_mounts,
                  runtime_constraints: c_runtime_constraints}
-      reusable = Container.find_reusable(c_attrs)
+
+      reusable = self.use_existing ? Container.find_reusable(c_attrs) : nil
       if not reusable.nil?
         reusable
       else
+        c_attrs[:scheduling_parameters] = self.scheduling_parameters
         Container.create!(c_attrs)
       end
     end
@@ -211,6 +237,25 @@ class ContainerRequest < ArvadosModel
           errors.add :runtime_constraints, "#{k} must be a positive integer"
         end
       end
+
+      if runtime_constraints.include? 'keep_cache_ram' and
+         (!runtime_constraints['keep_cache_ram'].is_a?(Integer) or
+          runtime_constraints['keep_cache_ram'] <= 0)
+            errors.add :runtime_constraints, "keep_cache_ram must be a positive integer"
+      elsif !runtime_constraints.include? 'keep_cache_ram'
+        runtime_constraints['keep_cache_ram'] = Rails.configuration.container_default_keep_cache_ram
+      end
+    end
+  end
+
+  def validate_scheduling_parameters
+    if self.state == Committed
+      if scheduling_parameters.include? 'partitions' and
+         (!scheduling_parameters['partitions'].is_a?(Array) ||
+          scheduling_parameters['partitions'].reject{|x| !x.is_a?(String)}.size !=
+            scheduling_parameters['partitions'].size)
+            errors.add :scheduling_parameters, "partitions must be an array of strings"
+      end
     end
   end
 
@@ -224,7 +269,7 @@ class ContainerRequest < ArvadosModel
                      :container_image, :cwd, :description, :environment,
                      :filters, :mounts, :name, :output_path, :priority,
                      :properties, :requesting_container_uuid, :runtime_constraints,
-                     :state, :container_uuid
+                     :state, :container_uuid, :use_existing, :scheduling_parameters
 
     when Committed
       if container_uuid.nil?
@@ -243,7 +288,7 @@ class ContainerRequest < ArvadosModel
         permitted.push :command, :container_image, :cwd, :description, :environment,
                        :filters, :mounts, :name, :output_path, :properties,
                        :requesting_container_uuid, :runtime_constraints,
-                       :state, :container_uuid
+                       :state, :container_uuid, :use_existing, :scheduling_parameters
       end
 
     when Final
@@ -251,8 +296,8 @@ class ContainerRequest < ArvadosModel
         errors.add :state, "of container request can only be set to Final by system."
       end
 
-      if self.state_changed? || self.name_changed? || self.description_changed?
-          permitted.push :state, :name, :description
+      if self.state_changed? || self.name_changed? || self.description_changed? || self.output_uuid_changed? || self.log_uuid_changed?
+          permitted.push :state, :name, :description, :output_uuid, :log_uuid
       else
         errors.add :state, "does not allow updates"
       end
index df80ea564d7a7d3a660a58ff84634c735c940d8f..3207d1f288f2f264c671d6709063d93140ce3fec 100644 (file)
@@ -46,7 +46,7 @@ class Log < ArvadosModel
       self.event_at = thing.created_at
     when "update"
       self.event_at = thing.modified_at
-    when "destroy"
+    when "delete"
       self.event_at = db_current_time
     end
     self
index c16e59a73c1a273dffeac557f6f78d4fbbea7caf..18550204669c7cc6353d87cfc863bcbf3c4d876a 100644 (file)
@@ -13,6 +13,8 @@ class Node < ArvadosModel
   belongs_to(:job, foreign_key: :job_uuid, primary_key: :uuid)
   attr_accessor :job_readable
 
+  UNUSED_NODE_IP = '127.40.4.0'
+
   api_accessible :user, :extend => :common do |t|
     t.add :hostname
     t.add :domain
@@ -137,20 +139,22 @@ class Node < ArvadosModel
   end
 
   def dns_server_update
-    if self.hostname_changed? or self.ip_address_changed?
-      if not self.ip_address.nil?
-        stale_conflicting_nodes = Node.where('id != ? and ip_address = ? and last_ping_at < ?',self.id,self.ip_address,10.minutes.ago)
-        if not stale_conflicting_nodes.empty?
-          # One or more stale compute node records have the same IP address as the new node.
-          # Clear the ip_address field on the stale nodes.
-          stale_conflicting_nodes.each do |stale_node|
-            stale_node.ip_address = nil
-            stale_node.save!
-          end
+    if hostname_changed? && hostname_was
+      self.class.dns_server_update(hostname_was, UNUSED_NODE_IP)
+    end
+    if hostname_changed? or ip_address_changed?
+      if ip_address
+        Node.where('id != ? and ip_address = ? and last_ping_at < ?',
+                   id, ip_address, 10.minutes.ago).each do |stale_node|
+          # One or more stale compute node records have the same IP
+          # address as the new node.  Clear the ip_address field on
+          # the stale nodes.
+          stale_node.ip_address = nil
+          stale_node.save!
         end
       end
-      if self.hostname and self.ip_address
-        self.class.dns_server_update(self.hostname, self.ip_address)
+      if hostname
+        self.class.dns_server_update(hostname, ip_address || UNUSED_NODE_IP)
       end
     end
   end
@@ -229,7 +233,7 @@ class Node < ArvadosModel
       if !File.exist? hostfile
         n = Node.where(:slot_number => slot_number).first
         if n.nil? or n.ip_address.nil?
-          dns_server_update(hostname, '127.40.4.0')
+          dns_server_update(hostname, UNUSED_NODE_IP)
         else
           dns_server_update(hostname, n.ip_address)
         end
index 28b9a26f7f359e051011a1c78062728a62c28afa..964de38d0bfbf56a195a2d622d71c763db508753 100644 (file)
@@ -261,6 +261,25 @@ class User < ArvadosModel
     self.save!
   end
 
+  def set_initial_username(requested: false)
+    if !requested.is_a?(String) || requested.empty?
+      email_parts = email.partition("@")
+      local_parts = email_parts.first.partition("+")
+      if email_parts.any?(&:empty?)
+        return
+      elsif not local_parts.first.empty?
+        requested = local_parts.first
+      else
+        requested = email_parts.first
+      end
+    end
+    requested.sub!(/^[^A-Za-z]+/, "")
+    requested.gsub!(/[^A-Za-z0-9]/, "")
+    unless requested.empty?
+      self.username = find_usable_username_from(requested)
+    end
+  end
+
   protected
 
   def ensure_ownership_path_leads_to_user
@@ -326,23 +345,6 @@ class User < ArvadosModel
     nil
   end
 
-  def set_initial_username
-    email_parts = email.partition("@")
-    local_parts = email_parts.first.partition("+")
-    if email_parts.any?(&:empty?)
-      return
-    elsif not local_parts.first.empty?
-      base_username = local_parts.first
-    else
-      base_username = email_parts.first
-    end
-    base_username.sub!(/^[^A-Za-z]+/, "")
-    base_username.gsub!(/[^A-Za-z0-9]/, "")
-    unless base_username.empty?
-      self.username = find_usable_username_from(base_username)
-    end
-  end
-
   def prevent_privilege_escalation
     if current_user.andand.is_admin
       return true
index bc752ed1d5f4d92b5ead8df2314e80a751f7b697..a9aa953f9f36e948dc57d34336c7d3f1cc1df43c 100644 (file)
@@ -264,6 +264,11 @@ common:
   # Use at your own risk.
   unlogged_attributes: []
 
+  # API methods to disable. Disabled methods are not listed in the
+  # discovery document, and respond 404 to all requests.
+  # Example: ["jobs.create", "pipeline_instances.create"]
+  disable_api_methods: []
+
   ###
   ### Crunch, DNS & compute node management
   ###
@@ -388,6 +393,9 @@ common:
   # with the cancelled container.
   container_count_max: 3
 
+  # Default value for keep_cache_ram of a container's runtime_constraints.
+  container_default_keep_cache_ram: 268435456
+
 development:
   force_ssl: false
   cache_classes: false
index 3638c726e9bf1118540243476169db913dbc7e58..f28390489dca3f42e14b7274407881009cc80b2f 100644 (file)
@@ -33,6 +33,7 @@ Server::Application.routes.draw do
         get 'auth', on: :member
         post 'lock', on: :member
         post 'unlock', on: :member
+        get 'current', on: :collection
       end
       resources :container_requests
       resources :jobs do
diff --git a/services/api/db/migrate/20161019171346_add_use_existing_to_container_requests.rb b/services/api/db/migrate/20161019171346_add_use_existing_to_container_requests.rb
new file mode 100644 (file)
index 0000000..100b83d
--- /dev/null
@@ -0,0 +1,9 @@
+class AddUseExistingToContainerRequests < ActiveRecord::Migration
+  def up
+    add_column :container_requests, :use_existing, :boolean, :default => true
+  end
+
+  def down
+    remove_column :container_requests, :use_existing
+  end
+end
diff --git a/services/api/db/migrate/20161111143147_add_scheduling_parameters_to_container.rb b/services/api/db/migrate/20161111143147_add_scheduling_parameters_to_container.rb
new file mode 100644 (file)
index 0000000..1b317cf
--- /dev/null
@@ -0,0 +1,6 @@
+class AddSchedulingParametersToContainer < ActiveRecord::Migration
+  def change
+    add_column :containers, :scheduling_parameters, :text
+    add_column :container_requests, :scheduling_parameters, :text
+  end
+end
diff --git a/services/api/db/migrate/20161115171221_add_output_and_log_uuid_to_container_request.rb b/services/api/db/migrate/20161115171221_add_output_and_log_uuid_to_container_request.rb
new file mode 100644 (file)
index 0000000..e38bf7c
--- /dev/null
@@ -0,0 +1,22 @@
+require 'has_uuid'
+
+class AddOutputAndLogUuidToContainerRequest < ActiveRecord::Migration
+  extend HasUuid::ClassMethods
+
+  def up
+    add_column :container_requests, :output_uuid, :string
+    add_column :container_requests, :log_uuid, :string
+
+    no_such_out_coll = Server::Application.config.uuid_prefix + '-' + '4zz18' + '-xxxxxxxxxxxxxxx'
+    no_such_log_coll = Server::Application.config.uuid_prefix + '-' + '4zz18' + '-yyyyyyyyyyyyyyy'
+
+    update_sql <<-EOS
+update container_requests set output_uuid = ('#{no_such_out_coll}'), log_uuid = ('#{no_such_log_coll}');
+EOS
+  end
+
+  def down
+    remove_column :container_requests, :log_uuid
+    remove_column :container_requests, :output_uuid
+  end
+end
diff --git a/services/api/db/migrate/20161115174218_add_output_and_log_uuids_to_container_request_search_index.rb b/services/api/db/migrate/20161115174218_add_output_and_log_uuids_to_container_request_search_index.rb
new file mode 100644 (file)
index 0000000..b069d02
--- /dev/null
@@ -0,0 +1,21 @@
+class AddOutputAndLogUuidsToContainerRequestSearchIndex < ActiveRecord::Migration
+  def up
+    begin
+      remove_index :container_requests, :name => 'container_requests_search_index'
+    rescue
+    end
+    add_index :container_requests,
+              ["uuid", "owner_uuid", "modified_by_client_uuid", "modified_by_user_uuid", "name", "state", "requesting_container_uuid", "container_uuid", "container_image", "cwd", "output_path", "output_uuid", "log_uuid"],
+              name: "container_requests_search_index"
+  end
+
+  def down
+    begin
+      remove_index :container_requests, :name => 'container_requests_search_index'
+    rescue
+    end
+         add_index :container_requests,
+              ["uuid", "owner_uuid", "modified_by_client_uuid", "modified_by_user_uuid", "name", "state", "requesting_container_uuid", "container_uuid", "container_image", "cwd", "output_path"],
+              name: "container_requests_search_index"
+  end
+end
index fa4760d8a0df2ad03781fb37bcdfa58beba2f2ae..e715cd60c4fcc0bb56e7a3df0ca7bbf01362cf9a 100644 (file)
@@ -290,7 +290,11 @@ CREATE TABLE container_requests (
     expires_at timestamp without time zone,
     filters text,
     updated_at timestamp without time zone NOT NULL,
-    container_count integer DEFAULT 0
+    container_count integer DEFAULT 0,
+    use_existing boolean DEFAULT true,
+    scheduling_parameters text,
+    output_uuid character varying(255),
+    log_uuid character varying(255)
 );
 
 
@@ -342,7 +346,8 @@ CREATE TABLE containers (
     updated_at timestamp without time zone NOT NULL,
     exit_code integer,
     auth_uuid character varying(255),
-    locked_by_uuid character varying(255)
+    locked_by_uuid character varying(255),
+    scheduling_parameters text
 );
 
 
@@ -1522,7 +1527,7 @@ CREATE INDEX container_requests_full_text_search_idx ON container_requests USING
 -- Name: container_requests_search_index; Type: INDEX; Schema: public; Owner: -; Tablespace: 
 --
 
-CREATE INDEX container_requests_search_index ON container_requests USING btree (uuid, owner_uuid, modified_by_client_uuid, modified_by_user_uuid, name, state, requesting_container_uuid, container_uuid, container_image, cwd, output_path);
+CREATE INDEX container_requests_search_index ON container_requests USING btree (uuid, owner_uuid, modified_by_client_uuid, modified_by_user_uuid, name, state, requesting_container_uuid, container_uuid, container_image, cwd, output_path, output_uuid, log_uuid);
 
 
 --
@@ -2691,4 +2696,12 @@ INSERT INTO schema_migrations (version) VALUES ('20160901210110');
 
 INSERT INTO schema_migrations (version) VALUES ('20160909181442');
 
-INSERT INTO schema_migrations (version) VALUES ('20160926194129');
\ No newline at end of file
+INSERT INTO schema_migrations (version) VALUES ('20160926194129');
+
+INSERT INTO schema_migrations (version) VALUES ('20161019171346');
+
+INSERT INTO schema_migrations (version) VALUES ('20161111143147');
+
+INSERT INTO schema_migrations (version) VALUES ('20161115171221');
+
+INSERT INTO schema_migrations (version) VALUES ('20161115174218');
\ No newline at end of file
index a7e8ff2fc8d7024b23b309c5b3e2de67abf5741f..1a6e38a4318657ccba4f3b86af08bb094401aa4c 100644 (file)
@@ -17,6 +17,7 @@ module OmniAuth
           :last_name => raw_info['info']['last_name'],
           :email => raw_info['info']['email'],
           :identity_url => raw_info['info']['identity_url'],
+          :username => raw_info['info']['username'],
         }
       end
 
index de14838186b00e1a3aebde728387882ef96f7c2e..0b5baf3b9c7e9cf4ff89d2e784d679baee0a5ec7 100644 (file)
@@ -284,3 +284,17 @@ dispatch1:
   user: system_user
   api_token: kwi8oowusvbutahacwk2geulqewy5oaqmpalczfna4b6bb0hfw
   expires_at: 2038-01-01 00:00:00
+
+running_container_auth:
+  uuid: zzzzz-gj3su-077z32aux8dg2s2
+  api_client: untrusted
+  user: active
+  api_token: 3kg6k6lzmp9kj6bpkcoxie963cmvjahbt2fod9zru30k1jqdmi
+  expires_at: 2038-01-01 00:00:00
+
+not_running_container_auth:
+  uuid: zzzzz-gj3su-077z32aux8dg2s3
+  api_client: untrusted
+  user: active
+  api_token: 4kg6k6lzmp9kj6bpkcoxie963cmvjahbt2fod9zru30k1jqdmj
+  expires_at: 2038-01-01 00:00:00
index b1154a8399e478d9fd2147fbb5fdb6cc8d46e016..2272b0f4a041094455c6a06a979a0ed4947f531a 100644 (file)
@@ -99,7 +99,7 @@ docker_image:
   uuid: zzzzz-4zz18-1v45jub259sjjgb
   # This Collection has links with Docker image metadata.
   portable_data_hash: fa3c1a9cb6783f85f2ecda037e07b8c3+167
-  owner_uuid: qr1hi-tpzed-000000000000000
+  owner_uuid: zzzzz-tpzed-000000000000000
   created_at: 2014-06-11T17:22:54Z
   modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
   modified_by_user_uuid: zzzzz-tpzed-d9tiejq69daie8f
@@ -108,12 +108,25 @@ docker_image:
   manifest_text: ". d21353cfe035e3e384563ee55eadbb2f+67108864 5c77a43e329b9838cbec18ff42790e57+55605760 0:122714624:d8309758b8fe2c81034ffc8a10c36460b77db7bc5e7b448c4e5b684f9d95a678.tar\n"
   name: docker_image
 
+# untagged docker image with sha256:{hash}.tar filename
+docker_image_1_12:
+  uuid: zzzzz-4zz18-1g4g0vhpjn9wq7i
+  portable_data_hash: d740a57097711e08eb9b2a93518f20ab+174
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  created_at: 2016-10-19 08:50:45.653552268 Z
+  modified_by_client_uuid: zzzzz-ozdt8-teyxzyd8qllg11h
+  modified_by_user_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  modified_at: 2016-10-19 08:50:45.652930000 Z
+  updated_at: 2016-10-19 08:50:45.652930000 Z
+  manifest_text: ". d21353cfe035e3e384563ee55eadbb2f+67108864 5c77a43e329b9838cbec18ff42790e57+55605760 0:122714624:sha256:d8309758b8fe2c81034ffc8a10c36460b77db7bc5e7b448c4e5b684f9d95a678.tar\n"
+  name: docker_image_1_12
+
 unlinked_docker_image:
   uuid: zzzzz-4zz18-d0d8z5wofvfgwad
   # This Collection contains a file that looks like a Docker image,
   # but has no Docker metadata links pointing to it.
   portable_data_hash: 9ae44d5792468c58bcf85ce7353c7027+124
-  owner_uuid: qr1hi-tpzed-000000000000000
+  owner_uuid: zzzzz-tpzed-000000000000000
   created_at: 2014-06-11T17:22:54Z
   modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
   modified_by_user_uuid: zzzzz-tpzed-d9tiejq69daie8f
@@ -553,6 +566,19 @@ collection_with_several_unsupported_file_types:
   manifest_text: ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:file 0:0:file.bam\n"
   name: collection_with_several_unsupported_file_types
 
+collection_not_readable_by_active:
+  uuid: zzzzz-4zz18-cd42uwvy3neko21
+  portable_data_hash: bb89eb5140e2848d39b416daeef4ffc5+45
+  owner_uuid: zzzzz-tpzed-000000000000000
+  created_at: 2014-02-03T17:22:54Z
+  modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
+  modified_by_user_uuid: zzzzz-tpzed-d9tiejq69daie8f
+  modified_at: 2014-02-03T17:22:54Z
+  updated_at: 2014-02-03T17:22:54Z
+  manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n"
+  name: collection_not_readable_by_active
+
+
 # Test Helper trims the rest of the file
 
 # Do not add your fixtures below this line as the rest of this file will be trimmed by test_helper
index 29266d3ab8f50f87586086c8702c676c2d7a7cb1..d1f4c7bdc8fac1248aa80d3b0a88d674900cc8e8 100644 (file)
@@ -28,7 +28,7 @@ running:
   runtime_constraints:
     ram: 12000000000
     vcpus: 4
-  auth_uuid: zzzzz-gj3su-077z32aux8dg2s1
+  auth_uuid: zzzzz-gj3su-077z32aux8dg2s2
 
 running_older:
   uuid: zzzzz-dz642-runningcontain2
@@ -133,7 +133,7 @@ requester_container:
   runtime_constraints:
     ram: 12000000000
     vcpus: 4
-  auth_uuid: zzzzz-gj3su-077z32aux8dg2s1
+  auth_uuid: zzzzz-gj3su-077z32aux8dg2s3
 
 failed_container:
   uuid: zzzzz-dz642-failedcontainr1
index 489bb1d6605f86d622c824260d96ef89f63bd026..c5516cc38b34dc9329fc759b1c61b2877681f1af 100644 (file)
@@ -47,7 +47,7 @@ was_idle_now_down:
   hostname: compute3
   slot_number: ~
   domain: ""
-  ip_address: 172.17.2.173
+  ip_address: 172.17.2.174
   last_ping_at: <%= 1.hour.ago.to_s(:db) %>
   first_ping_at: <%= 23.hour.ago.to_s(:db) %>
   job_uuid: ~
@@ -62,7 +62,7 @@ new_with_no_hostname:
   owner_uuid: zzzzz-tpzed-000000000000000
   hostname: ~
   slot_number: ~
-  ip_address: 172.17.2.173
+  ip_address: 172.17.2.175
   last_ping_at: ~
   first_ping_at: ~
   job_uuid: ~
@@ -74,7 +74,7 @@ new_with_custom_hostname:
   owner_uuid: zzzzz-tpzed-000000000000000
   hostname: custom1
   slot_number: 23
-  ip_address: 172.17.2.173
+  ip_address: 172.17.2.176
   last_ping_at: ~
   first_ping_at: ~
   job_uuid: ~
index 634fce79706254069196160410d132e2ed277ae1..b96e22ed6583befa82153c623da9bac73014745e 100644 (file)
@@ -46,6 +46,49 @@ class Arvados::V1::CollectionsControllerTest < ActionController::TestCase
     end
   end
 
+  test 'index without select returns everything except manifest' do
+    authorize_with :active
+    get :index
+    assert_response :success
+    assert json_response['items'].any?
+    json_response['items'].each do |coll|
+      assert_includes(coll.keys, 'uuid')
+      assert_includes(coll.keys, 'name')
+      assert_includes(coll.keys, 'created_at')
+      refute_includes(coll.keys, 'manifest_text')
+    end
+  end
+
+  ['', nil, false, 'null'].each do |select|
+    test "index with select=#{select.inspect} returns everything except manifest" do
+      authorize_with :active
+      get :index, select: select
+      assert_response :success
+      assert json_response['items'].any?
+      json_response['items'].each do |coll|
+        assert_includes(coll.keys, 'uuid')
+        assert_includes(coll.keys, 'name')
+        assert_includes(coll.keys, 'created_at')
+        refute_includes(coll.keys, 'manifest_text')
+      end
+    end
+  end
+
+  [["uuid"],
+   ["uuid", "manifest_text"],
+   '["uuid"]',
+   '["uuid", "manifest_text"]'].each do |select|
+    test "index with select=#{select.inspect} returns no name" do
+      authorize_with :active
+      get :index, select: select
+      assert_response :success
+      assert json_response['items'].any?
+      json_response['items'].each do |coll|
+        refute_includes(coll.keys, 'name')
+      end
+    end
+  end
+
   [0,1,2].each do |limit|
     test "get index with limit=#{limit}" do
       authorize_with :active
diff --git a/services/api/test/functional/arvados/v1/container_requests_controller_test.rb b/services/api/test/functional/arvados/v1/container_requests_controller_test.rb
new file mode 100644 (file)
index 0000000..e54e15d
--- /dev/null
@@ -0,0 +1,22 @@
+require 'test_helper'
+
+class Arvados::V1::ContainerRequestsControllerTest < ActionController::TestCase
+  test 'create with scheduling parameters' do
+    authorize_with :system_user
+
+    sp = {'partitions' => ['test1', 'test2']}
+    post :create, {
+      container_request: {
+        command: ['echo', 'hello'],
+        container_image: 'test',
+        output_path: 'test',
+        scheduling_parameters: sp,
+      },
+    }
+    assert_response :success
+
+    cr = JSON.parse(@response.body)
+    assert_not_nil cr, 'Expected container request'
+    assert_equal sp, cr['scheduling_parameters']
+  end
+end
index cf1f5765b4d2460ae854356088d15bc7c8061add..65a1a915da26398e89f41203472304d97ae0082b 100644 (file)
@@ -87,4 +87,23 @@ class Arvados::V1::ContainersControllerTest < ActionController::TestCase
       assert_equal state, Container.where(uuid: uuid).first.state
     end
   end
+
+  test 'get current container for token' do
+    authorize_with :running_container_auth
+    get :current
+    assert_response :success
+    assert_equal containers(:running).uuid, json_response['uuid']
+  end
+
+  test 'no container associated with token' do
+    authorize_with :dispatch1
+    get :current
+    assert_response 404
+  end
+
+  test 'try get current container, no token' do
+    get :current
+    assert_response 401
+  end
+
 end
index 9a0aa504439d13700ce7e3a9d654681221f12155..8808a82c45c92d398df02e497438f137a7bf1e1a 100644 (file)
@@ -508,4 +508,17 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase
     assert_not_nil json_response["components"]
     assert_equal [], json_response["components"].keys
   end
+
+  test 'jobs.create disabled in config' do
+    Rails.configuration.disable_api_methods = ["jobs.create",
+                                               "pipeline_instances.create"]
+    authorize_with :active
+    post :create, job: {
+      script: "hash",
+      script_version: "master",
+      repository: "active/foo",
+      script_parameters: {}
+    }
+    assert_response 404
+  end
 end
index f651d81eb3dd13a049896e0e9cdccb87eda6d548..2e370ec9cd63db9b61f6e93ab15111d028f469e0 100644 (file)
@@ -42,4 +42,23 @@ class Arvados::V1::SchemaControllerTest < ActionController::TestCase
     discovery_doc = JSON.parse(@response.body)
     assert_equal 'aaa888fff', discovery_doc['source_version']
   end
+
+  test "empty disable_api_methods" do
+    get :index
+    assert_response :success
+    discovery_doc = JSON.parse(@response.body)
+    assert_equal('POST',
+                 discovery_doc['resources']['jobs']['methods']['create']['httpMethod'])
+  end
+
+  test "non-empty disable_api_methods" do
+    Rails.configuration.disable_api_methods =
+      ['jobs.create', 'pipeline_instances.create', 'pipeline_templates.create']
+    get :index
+    assert_response :success
+    discovery_doc = JSON.parse(@response.body)
+    ['jobs', 'pipeline_instances', 'pipeline_templates'].each do |r|
+      refute_includes(discovery_doc['resources'][r]['methods'].keys(), 'create')
+    end
+  end
 end
index 814e6eb670c0ca77c193ef10af805d34282708aa..7a9f9176d335c02c1a7dc425cf4212dfb85e0ea5 100644 (file)
@@ -5,7 +5,7 @@ class UserSessionsApiTest < ActionDispatch::IntegrationTest
     'https://wb.example.com'
   end
 
-  def mock_auth_with_email email
+  def mock_auth_with(email: nil, username: nil)
     mock = {
       'provider' => 'josh_id',
       'uid' => 'https://edward.example.com',
@@ -14,17 +14,30 @@ class UserSessionsApiTest < ActionDispatch::IntegrationTest
         'name' => 'Edward Example',
         'first_name' => 'Edward',
         'last_name' => 'Example',
-        'email' => email,
       },
     }
+    mock['info']['email'] = email unless email.nil?
+    mock['info']['username'] = username unless username.nil?
     post('/auth/josh_id/callback',
          {return_to: client_url},
          {'omniauth.auth' => mock})
     assert_response :redirect, 'Did not redirect to client with token'
   end
 
+  test 'assign username from sso' do
+    mock_auth_with(email: 'foo@example.com', username: 'bar')
+    u = assigns(:user)
+    assert_equal 'bar', u.username
+  end
+
+  test 'no assign username from sso' do
+    mock_auth_with(email: 'foo@example.com')
+    u = assigns(:user)
+    assert_equal 'foo', u.username
+  end
+
   test 'create new user during omniauth callback' do
-    mock_auth_with_email 'edward@example.com'
+    mock_auth_with(email: 'edward@example.com')
     assert_equal(0, @response.redirect_url.index(client_url),
                  'Redirected to wrong address after succesful login: was ' +
                  @response.redirect_url + ', expected ' + client_url + '[...]')
@@ -61,7 +74,7 @@ class UserSessionsApiTest < ActionDispatch::IntegrationTest
       Rails.configuration.auto_setup_new_users_with_repository =
         testcase[:cfg][:repo]
 
-      mock_auth_with_email testcase[:email]
+      mock_auth_with(email: testcase[:email])
       u = assigns(:user)
       vm_links = Link.where('link_class=? and tail_uuid=? and head_uuid like ?',
                             'permission', u.uuid,
index 3b175742370b93bf983754d06e459115a7180d84..c4d1efec30802d75025c9c4560457815fea7f80b 100644 (file)
@@ -129,7 +129,7 @@ class ContainerRequestTest < ActiveSupport::TestCase
     assert_equal({}, c.environment)
     assert_equal({"/out" => {"kind"=>"tmp", "capacity"=>1000000}}, c.mounts)
     assert_equal "/out", c.output_path
-    assert_equal({"vcpus" => 2, "ram" => 30}, c.runtime_constraints)
+    assert_equal({"keep_cache_ram"=>268435456, "vcpus" => 2, "ram" => 30}, c.runtime_constraints)
     assert_equal 1, c.priority
 
     assert_raises(ActiveRecord::RecordInvalid) do
@@ -230,10 +230,12 @@ class ContainerRequestTest < ActiveSupport::TestCase
     cr.reload
     assert_equal "Committed", cr.state
 
+    output_pdh = '1f4b0bc7583c2a7f9102c395f4ffc5e3+45'
+    log_pdh = 'fa7aeb5140e2848d39b416daeef4ffc5+45'
     act_as_system_user do
       c.update_attributes!(state: Container::Complete,
-                           output: '1f4b0bc7583c2a7f9102c395f4ffc5e3+45',
-                           log: 'fa7aeb5140e2848d39b416daeef4ffc5+45')
+                           output: output_pdh,
+                           log: log_pdh)
     end
 
     cr.reload
@@ -244,6 +246,12 @@ class ContainerRequestTest < ActiveSupport::TestCase
                                        owner_uuid: project.uuid).count,
                    "Container #{out_type} should be copied to #{project.uuid}")
     end
+    assert_not_nil cr.output_uuid
+    assert_not_nil cr.log_uuid
+    output = Collection.find_by_uuid cr.output_uuid
+    assert_equal output_pdh, output.portable_data_hash
+    log = Collection.find_by_uuid cr.log_uuid
+    assert_equal log_pdh, log.portable_data_hash
   end
 
   test "Container makes container request, then is cancelled" do
@@ -276,7 +284,7 @@ class ContainerRequestTest < ActiveSupport::TestCase
   end
 
   [
-    ['active', 'zzzzz-dz642-runningcontainr'],
+    ['running_container_auth', 'zzzzz-dz642-runningcontainr'],
     ['active_no_prefs', nil],
   ].each do |token, expected|
     test "create as #{token} and expect requesting_container_uuid to be #{expected}" do
@@ -384,10 +392,12 @@ class ContainerRequestTest < ActiveSupport::TestCase
 
   test "container_image_for_container(pdh)" do
     set_user_from_auth :active
-    pdh = collections(:docker_image).portable_data_hash
-    cr = ContainerRequest.new(container_image: pdh)
-    resolved = cr.send :container_image_for_container
-    assert_equal resolved, pdh
+    [:docker_image, :docker_image_1_12].each do |coll|
+      pdh = collections(coll).portable_data_hash
+      cr = ContainerRequest.new(container_image: pdh)
+      resolved = cr.send :container_image_for_container
+      assert_equal resolved, pdh
+    end
   end
 
   ['acbd18db4cc2f85cedef654fccc4a4d8+3',
@@ -410,30 +420,44 @@ class ContainerRequestTest < ActiveSupport::TestCase
   end
 
   [
-    [{"var" => "value1"}, {"var" => "value1"}],
-    [{"var" => "value1"}, {"var" => "value2"}]
-  ].each do |env1, env2|
-    test "Container request #{(env1 == env2) ? 'does' : 'does not'} reuse container when committed" do
+    [{"var" => "value1"}, {"var" => "value1"}, nil],
+    [{"var" => "value1"}, {"var" => "value1"}, true],
+    [{"var" => "value1"}, {"var" => "value1"}, false],
+    [{"var" => "value1"}, {"var" => "value2"}, nil],
+  ].each do |env1, env2, use_existing|
+    test "Container request #{((env1 == env2) and (use_existing.nil? or use_existing == true)) ? 'does' : 'does not'} reuse container when committed#{use_existing.nil? ? '' : use_existing ? ' and use_existing == true' : ' and use_existing == false'}" do
       common_attrs = {cwd: "test",
                       priority: 1,
                       command: ["echo", "hello"],
                       output_path: "test",
                       runtime_constraints: {"vcpus" => 4,
-                                            "ram" => 12000000000},
+                                            "ram" => 12000000000,
+                                            "keep_cache_ram" => 268435456},
                       mounts: {"test" => {"kind" => "json"}}}
       set_user_from_auth :active
       cr1 = create_minimal_req!(common_attrs.merge({state: ContainerRequest::Committed,
                                                     environment: env1}))
-      cr2 = create_minimal_req!(common_attrs.merge({state: ContainerRequest::Uncommitted,
-                                                    environment: env2}))
+      if use_existing.nil?
+        # Testing with use_existing default value
+        cr2 = create_minimal_req!(common_attrs.merge({state: ContainerRequest::Uncommitted,
+                                                      environment: env2}))
+      else
+
+        cr2 = create_minimal_req!(common_attrs.merge({state: ContainerRequest::Uncommitted,
+                                                      environment: env2,
+                                                      use_existing: use_existing}))
+      end
       assert_not_nil cr1.container_uuid
       assert_nil cr2.container_uuid
 
-      # Update cr2 to commited state and check for container equality on both cases,
-      # when env1 and env2 are equal the same container should be assigned, and
-      # when env1 and env2 are different, cr2 container should be different.
+      # Update cr2 to commited state and check for container equality on different cases:
+      # * When env1 and env2 are equal and use_existing is true, the same container
+      #   should be assigned.
+      # * When use_existing is false, a different container should be assigned.
+      # * When env1 and env2 are different, a different container should be assigned.
       cr2.update_attributes!({state: ContainerRequest::Committed})
-      assert_equal (env1 == env2), (cr1.container_uuid == cr2.container_uuid)
+      assert_equal (cr2.use_existing == true and (env1 == env2)),
+                   (cr1.container_uuid == cr2.container_uuid)
     end
   end
 
@@ -481,4 +505,91 @@ class ContainerRequestTest < ActiveSupport::TestCase
     assert_equal prev_container_uuid, cr.container_uuid
   end
 
+  test "Finalize committed request when reusing a finished container" do
+    set_user_from_auth :active
+    cr = create_minimal_req!(priority: 1, state: ContainerRequest::Committed)
+    cr.reload
+    assert_equal ContainerRequest::Committed, cr.state
+    act_as_system_user do
+      c = Container.find_by_uuid(cr.container_uuid)
+      c.update_attributes!(state: Container::Locked)
+      c.update_attributes!(state: Container::Running)
+      c.update_attributes!(state: Container::Complete,
+                           exit_code: 0,
+                           output: '1f4b0bc7583c2a7f9102c395f4ffc5e3+45',
+                           log: 'fa7aeb5140e2848d39b416daeef4ffc5+45')
+    end
+    cr.reload
+    assert_equal ContainerRequest::Final, cr.state
+
+    cr2 = create_minimal_req!(priority: 1, state: ContainerRequest::Committed)
+    assert_equal cr.container_uuid, cr2.container_uuid
+    assert_equal ContainerRequest::Final, cr2.state
+
+    cr3 = create_minimal_req!(priority: 1, state: ContainerRequest::Uncommitted)
+    assert_equal ContainerRequest::Uncommitted, cr3.state
+    cr3.update_attributes!(state: ContainerRequest::Committed)
+    assert_equal cr.container_uuid, cr3.container_uuid
+    assert_equal ContainerRequest::Final, cr3.state
+  end
+
+  [
+    [{"vcpus" => 1, "ram" => 123, "keep_cache_ram" => 100}, ContainerRequest::Committed, 100],
+    [{"vcpus" => 1, "ram" => 123}, ContainerRequest::Uncommitted],
+    [{"vcpus" => 1, "ram" => 123}, ContainerRequest::Committed],
+    [{"vcpus" => 1, "ram" => 123, "keep_cache_ram" => -1}, ContainerRequest::Committed, ActiveRecord::RecordInvalid],
+    [{"vcpus" => 1, "ram" => 123, "keep_cache_ram" => '123'}, ContainerRequest::Committed, ActiveRecord::RecordInvalid],
+  ].each do |rc, state, expected|
+    test "create container request with #{rc} in state #{state} and verify keep_cache_ram #{expected}" do
+      common_attrs = {cwd: "test",
+                      priority: 1,
+                      command: ["echo", "hello"],
+                      output_path: "test",
+                      runtime_constraints: rc,
+                      mounts: {"test" => {"kind" => "json"}}}
+      set_user_from_auth :active
+
+      if expected == ActiveRecord::RecordInvalid
+        assert_raises(ActiveRecord::RecordInvalid) do
+          create_minimal_req!(common_attrs.merge({state: state}))
+        end
+      else
+        cr = create_minimal_req!(common_attrs.merge({state: state}))
+        expected = Rails.configuration.container_default_keep_cache_ram if state == ContainerRequest::Committed and expected.nil?
+        assert_equal expected, cr.runtime_constraints['keep_cache_ram']
+      end
+    end
+  end
+
+  [
+    [{"partitions" => ["fastcpu","vfastcpu", 100]}, ContainerRequest::Committed, ActiveRecord::RecordInvalid],
+    [{"partitions" => ["fastcpu","vfastcpu", 100]}, ContainerRequest::Uncommitted],
+    [{"partitions" => "fastcpu"}, ContainerRequest::Committed, ActiveRecord::RecordInvalid],
+    [{"partitions" => "fastcpu"}, ContainerRequest::Uncommitted],
+    [{"partitions" => ["fastcpu","vfastcpu"]}, ContainerRequest::Committed],
+  ].each do |sp, state, expected|
+    test "create container request with scheduling_parameters #{sp} in state #{state} and verify #{expected}" do
+      common_attrs = {cwd: "test",
+                      priority: 1,
+                      command: ["echo", "hello"],
+                      output_path: "test",
+                      scheduling_parameters: sp,
+                      mounts: {"test" => {"kind" => "json"}}}
+      set_user_from_auth :active
+
+      if expected == ActiveRecord::RecordInvalid
+        assert_raises(ActiveRecord::RecordInvalid) do
+          create_minimal_req!(common_attrs.merge({state: state}))
+        end
+      else
+        cr = create_minimal_req!(common_attrs.merge({state: state}))
+        assert_equal sp, cr.scheduling_parameters
+
+        if state == ContainerRequest::Committed
+          c = Container.find_by_uuid(cr.container_uuid)
+          assert_equal sp, c.scheduling_parameters
+        end
+      end
+    end
+  end
 end
index 8894ed9d4c0e16dc32a8b5bbc95d0a1371d3f41f..4fd9f8e75931eff3d3f66e8fcddd4e65253cec7f 100644 (file)
@@ -5,13 +5,13 @@ class ContainerTest < ActiveSupport::TestCase
 
   DEFAULT_ATTRS = {
     command: ['echo', 'foo'],
-    container_image: 'img',
+    container_image: 'fa3c1a9cb6783f85f2ecda037e07b8c3+167',
     output_path: '/tmp',
     priority: 1,
     runtime_constraints: {"vcpus" => 1, "ram" => 1},
   }
 
-  REUSABLE_COMMON_ATTRS = {container_image: "test",
+  REUSABLE_COMMON_ATTRS = {container_image: "9ae44d5792468c58bcf85ce7353c7027+124",
                            cwd: "test",
                            command: ["echo", "hello"],
                            output_path: "test",
@@ -22,16 +22,12 @@ class ContainerTest < ActiveSupport::TestCase
 
   def minimal_new attrs={}
     cr = ContainerRequest.new DEFAULT_ATTRS.merge(attrs)
+    cr.state = ContainerRequest::Committed
     act_as_user users(:active) do
       cr.save!
     end
-    c = Container.new DEFAULT_ATTRS.merge(attrs)
-    act_as_system_user do
-      c.save!
-      assert cr.update_attributes(container_uuid: c.uuid,
-                                  state: ContainerRequest::Committed,
-                                  ), show_errors(cr)
-    end
+    c = Container.find_by_uuid cr.container_uuid
+    assert_not_nil c
     return c, cr
   end
 
@@ -45,7 +41,7 @@ class ContainerTest < ActiveSupport::TestCase
 
   def check_illegal_modify c
     check_illegal_updates c, [{command: ["echo", "bar"]},
-                              {container_image: "img2"},
+                              {container_image: "arvados/apitestfixture:june10"},
                               {cwd: "/tmp2"},
                               {environment: {"FOO" => "BAR"}},
                               {mounts: {"FOO" => "BAR"}},
@@ -89,7 +85,7 @@ class ContainerTest < ActiveSupport::TestCase
 
   test "Container serialized hash attributes sorted before save" do
     env = {"C" => 3, "B" => 2, "A" => 1}
-    m = {"F" => 3, "E" => 2, "D" => 1}
+    m = {"F" => {"kind" => 3}, "E" => {"kind" => 2}, "D" => {"kind" => 1}}
     rc = {"vcpus" => 1, "ram" => 1}
     c, _ = minimal_new(environment: env, mounts: m, runtime_constraints: rc)
     assert_equal c.environment.to_json, Container.deep_sort_hash(env).to_json
@@ -144,17 +140,28 @@ class ContainerTest < ActiveSupport::TestCase
 
   test "find_reusable method should not select completed container when inconsistent outputs exist" do
     set_user_from_auth :active
-    common_attrs = REUSABLE_COMMON_ATTRS.merge({environment: {"var" => "complete"}})
+    common_attrs = REUSABLE_COMMON_ATTRS.merge({environment: {"var" => "complete"}, priority: 1})
     completed_attrs = {
       state: Container::Complete,
       exit_code: 0,
       log: 'ea10d51bcf88862dbcc36eb292017dfd+45',
     }
 
-    c_output1, _ = minimal_new(common_attrs)
-    c_output2, _ = minimal_new(common_attrs)
-
     set_user_from_auth :dispatch1
+
+    c_output1 = Container.create common_attrs
+    c_output2 = Container.create common_attrs
+
+    cr = ContainerRequest.new common_attrs
+    cr.state = ContainerRequest::Committed
+    cr.container_uuid = c_output1.uuid
+    cr.save!
+
+    cr = ContainerRequest.new common_attrs
+    cr.state = ContainerRequest::Committed
+    cr.container_uuid = c_output2.uuid
+    cr.save!
+
     c_output1.update_attributes!({state: Container::Locked})
     c_output1.update_attributes!({state: Container::Running})
     c_output1.update_attributes!(completed_attrs.merge({output: '1f4b0bc7583c2a7f9102c395f4ffc5e3+45'}))
@@ -427,4 +434,59 @@ class ContainerTest < ActiveSupport::TestCase
 
     assert c.update_attributes(exit_code: 1, state: Container::Complete)
   end
+
+  test "locked_by_uuid can set output on running container" do
+    c, _ = minimal_new
+    set_user_from_auth :dispatch1
+    c.lock
+    c.update_attributes! state: Container::Running
+
+    assert_equal c.locked_by_uuid, Thread.current[:api_client_authorization].uuid
+
+    assert c.update_attributes output: collections(:collection_owned_by_active).portable_data_hash
+    assert c.update_attributes! state: Container::Complete
+  end
+
+  test "auth_uuid can set output on running container, but not change container state" do
+    c, _ = minimal_new
+    set_user_from_auth :dispatch1
+    c.lock
+    c.update_attributes! state: Container::Running
+
+    Thread.current[:api_client_authorization] = ApiClientAuthorization.find_by_uuid(c.auth_uuid)
+    Thread.current[:user] = User.find_by_id(Thread.current[:api_client_authorization].user_id)
+    assert c.update_attributes output: collections(:collection_owned_by_active).portable_data_hash
+
+    assert_raises ArvadosModel::PermissionDeniedError do
+      # auth_uuid cannot set container state
+      c.update_attributes state: Container::Complete
+    end
+  end
+
+  test "not allowed to set output that is not readable by current user" do
+    c, _ = minimal_new
+    set_user_from_auth :dispatch1
+    c.lock
+    c.update_attributes! state: Container::Running
+
+    Thread.current[:api_client_authorization] = ApiClientAuthorization.find_by_uuid(c.auth_uuid)
+    Thread.current[:user] = User.find_by_id(Thread.current[:api_client_authorization].user_id)
+
+    assert_raises ActiveRecord::RecordInvalid do
+      c.update_attributes! output: collections(:collection_not_readable_by_active).portable_data_hash
+    end
+  end
+
+  test "other token cannot set output on running container" do
+    c, _ = minimal_new
+    set_user_from_auth :dispatch1
+    c.lock
+    c.update_attributes! state: Container::Running
+
+    set_user_from_auth :not_running_container_auth
+    assert_raises ArvadosModel::PermissionDeniedError do
+      c.update_attributes! output: collections(:foo_file).portable_data_hash
+    end
+  end
+
 end
index 632271e98c263efad7a5869e1831da69ceaf3b97..efbb189c9f8f0e50f1db262a8cd3bac7342a0b03 100644 (file)
@@ -6,7 +6,7 @@ class LogTest < ActiveSupport::TestCase
   EVENT_TEST_METHODS = {
     :create => [:created_at, :assert_nil, :assert_not_nil],
     :update => [:modified_at, :assert_not_nil, :assert_not_nil],
-    :destroy => [nil, :assert_not_nil, :assert_nil],
+    :delete => [nil, :assert_not_nil, :assert_nil],
   }
 
   setup do
@@ -116,7 +116,7 @@ class LogTest < ActiveSupport::TestCase
     orig_attrs = auth.attributes
     orig_attrs.delete 'api_token'
     auth.destroy
-    assert_logged(auth, :destroy) do |props|
+    assert_logged(auth, :delete) do |props|
       assert_equal(orig_etag, props['old_etag'], "destroyed auth etag mismatch")
       assert_equal(orig_attrs, props['old_attributes'],
                    "destroyed auth attributes mismatch")
@@ -230,7 +230,7 @@ class LogTest < ActiveSupport::TestCase
     auth.save!
     assert_logged_with_clean_properties(auth, :update, 'api_token')
     auth.destroy
-    assert_logged_with_clean_properties(auth, :destroy, 'api_token')
+    assert_logged_with_clean_properties(auth, :delete, 'api_token')
   end
 
   test "use ownership and permission links to determine which logs a user can see" do
@@ -283,7 +283,7 @@ class LogTest < ActiveSupport::TestCase
       coll.save!
       assert_logged_with_clean_properties(coll, :update, 'manifest_text')
       coll.destroy
-      assert_logged_with_clean_properties(coll, :destroy, 'manifest_text')
+      assert_logged_with_clean_properties(coll, :delete, 'manifest_text')
     end
   end
 
@@ -302,7 +302,7 @@ class LogTest < ActiveSupport::TestCase
         assert_equal(txt, props['new_attributes']['manifest_text'])
       end
       coll.destroy
-      assert_logged(coll, :destroy) do |props|
+      assert_logged(coll, :delete) do |props|
         assert_equal(txt, props['old_attributes']['manifest_text'])
       end
     end
index e5b88354fb128e1308c1a00a7c9e297928f191dd..6eb1df56d129f0279c2e86323b865d13fd09817c 100644 (file)
@@ -125,4 +125,31 @@ class NodeTest < ActiveSupport::TestCase
     refute_nil node2.slot_number
     assert_equal "custom1", node2.hostname
   end
+
+  test "update dns when nodemanager clears hostname and ip_address" do
+    act_as_system_user do
+      node = ping_node(:new_with_custom_hostname, {})
+      Node.expects(:dns_server_update).with(node.hostname, Node::UNUSED_NODE_IP)
+      node.update_attributes(hostname: nil, ip_address: nil)
+    end
+  end
+
+  test "update dns when hostname changes" do
+    act_as_system_user do
+      node = ping_node(:new_with_custom_hostname, {})
+
+      Node.expects(:dns_server_update).with(node.hostname, Node::UNUSED_NODE_IP)
+      Node.expects(:dns_server_update).with('foo0', node.ip_address)
+      node.update_attributes!(hostname: 'foo0')
+
+      Node.expects(:dns_server_update).with('foo0', Node::UNUSED_NODE_IP)
+      node.update_attributes!(hostname: nil, ip_address: nil)
+
+      Node.expects(:dns_server_update).with('foo0', '10.11.12.13')
+      node.update_attributes!(hostname: 'foo0', ip_address: '10.11.12.13')
+
+      Node.expects(:dns_server_update).with('foo0', '10.11.12.14')
+      node.update_attributes!(hostname: 'foo0', ip_address: '10.11.12.14')
+    end
+  end
 end
index f71c2ffbb5482ee6b93914ad4c7d824a555325cc..c41a5f3465d61403959a366565a89ec671af236e 100644 (file)
@@ -2,7 +2,7 @@
 Description=Arvados git server
 Documentation=https://doc.arvados.org/
 After=network.target
-AssertPathExists=/etc/arvados/arvados-git-httpd/arvados-git-httpd.yml
+AssertPathExists=/etc/arvados/git-httpd/git-httpd.yml
 
 [Service]
 Type=notify
diff --git a/services/arv-git-httpd/doc.go b/services/arv-git-httpd/doc.go
deleted file mode 100644 (file)
index ff4599d..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-arv-git-httpd provides authenticated access to Arvados-hosted git repositories.
-
-See http://doc.arvados.org/install/install-arv-git-httpd.html.
-
-Example:
-
-       arv-git-httpd -address=:8000 -repo-root=/var/lib/arvados/git
-
-Options:
-
-       -address [host]:[port]
-
-Listen at the given host and port.
-
-Host can be a domain name, an IP address, or empty (listen on all
-addresses).
-
-Port can be a name, a port number, or 0 (choose an available port).
-
-       -repo-root path
-
-Directory containing git repositories. When a client requests either
-"foo/bar.git" or "foo/bar/.git", git-http-backend will be invoked on
-"path/foo/bar.git" or (if that doesn't exist) "path/foo/bar/.git".
-
-       -git-command path
-
-Location of the CGI program to execute for each authorized request
-(normally this is gitolite-shell if repositories are controlled by
-gitolite, otherwise git). It is invoked with a single argument,
-'http-backend'.  Default is /usr/bin/git.
-
-*/
-package main
index f0b98fab72382dfa02c2b12a144e2a6b9f5190c4..2caf1294e060c7af7f1323a10a75e837a417f177 100644 (file)
@@ -5,6 +5,7 @@ import (
        "net"
        "net/http"
        "net/http/cgi"
+       "os"
 )
 
 // gitHandler is an http.Handler that invokes git-http-backend (or
@@ -16,21 +17,29 @@ type gitHandler struct {
 }
 
 func newGitHandler() http.Handler {
+       const glBypass = "GL_BYPASS_ACCESS_CHECKS"
+       const glHome = "GITOLITE_HTTP_HOME"
+       var env []string
+       path := os.Getenv("PATH")
+       if theConfig.GitoliteHome != "" {
+               env = append(env,
+                       glHome+"="+theConfig.GitoliteHome,
+                       glBypass+"=1")
+               path = path + ":" + theConfig.GitoliteHome + "/bin"
+       } else if home, bypass := os.Getenv(glHome), os.Getenv(glBypass); home != "" || bypass != "" {
+               env = append(env, glHome+"="+home, glBypass+"="+bypass)
+               log.Printf("DEPRECATED: Passing through %s and %s environment variables. Use GitoliteHome configuration instead.", glHome, glBypass)
+       }
+       env = append(env,
+               "GIT_PROJECT_ROOT="+theConfig.RepoRoot,
+               "GIT_HTTP_EXPORT_ALL=",
+               "SERVER_ADDR="+theConfig.Listen,
+               "PATH="+path)
        return &gitHandler{
                Handler: cgi.Handler{
                        Path: theConfig.GitCommand,
                        Dir:  theConfig.RepoRoot,
-                       Env: []string{
-                               "GIT_PROJECT_ROOT=" + theConfig.RepoRoot,
-                               "GIT_HTTP_EXPORT_ALL=",
-                               "SERVER_ADDR=" + theConfig.Listen,
-                       },
-                       InheritEnv: []string{
-                               "PATH",
-                               // Needed if GitCommand is gitolite-shell:
-                               "GITOLITE_HTTP_HOME",
-                               "GL_BYPASS_ACCESS_CHECKS",
-                       },
+                       Env:  env,
                        Args: []string{"http-backend"},
                },
        }
index d87162dca3aa6f80ac16411c4a138e6286fc40e2..6b08eeecdc303a246cba91873fd5c44a4ddddb4a 100644 (file)
@@ -4,7 +4,6 @@ import (
        "net/http"
        "net/http/httptest"
        "net/url"
-       "os"
        "regexp"
 
        check "gopkg.in/check.v1"
@@ -15,6 +14,10 @@ var _ = check.Suite(&GitHandlerSuite{})
 type GitHandlerSuite struct{}
 
 func (s *GitHandlerSuite) TestEnvVars(c *check.C) {
+       theConfig = defaultConfig()
+       theConfig.RepoRoot = "/"
+       theConfig.GitoliteHome = "/test/ghh"
+
        u, err := url.Parse("git.zzzzz.arvadosapi.com/test")
        c.Check(err, check.Equals, nil)
        resp := httptest.NewRecorder()
@@ -26,15 +29,14 @@ func (s *GitHandlerSuite) TestEnvVars(c *check.C) {
        h := newGitHandler()
        h.(*gitHandler).Path = "/bin/sh"
        h.(*gitHandler).Args = []string{"-c", "printf 'Content-Type: text/plain\r\n\r\n'; env"}
-       os.Setenv("GITOLITE_HTTP_HOME", "/test/ghh")
-       os.Setenv("GL_BYPASS_ACCESS_CHECKS", "yesplease")
 
        h.ServeHTTP(resp, req)
 
        c.Check(resp.Code, check.Equals, http.StatusOK)
        body := resp.Body.String()
+       c.Check(body, check.Matches, `(?ms).*^PATH=.*:/test/ghh/bin$.*`)
        c.Check(body, check.Matches, `(?ms).*^GITOLITE_HTTP_HOME=/test/ghh$.*`)
-       c.Check(body, check.Matches, `(?ms).*^GL_BYPASS_ACCESS_CHECKS=yesplease$.*`)
+       c.Check(body, check.Matches, `(?ms).*^GL_BYPASS_ACCESS_CHECKS=1$.*`)
        c.Check(body, check.Matches, `(?ms).*^REMOTE_HOST=::1$.*`)
        c.Check(body, check.Matches, `(?ms).*^REMOTE_PORT=12345$.*`)
        c.Check(body, check.Matches, `(?ms).*^SERVER_ADDR=`+regexp.QuoteMeta(theConfig.Listen)+`$.*`)
index 74c2b8cf4d91a8ac3da2835b12e90a35e6dd0380..38ff2309c1d2a3a57def17ac588276dab204e265 100644 (file)
@@ -48,9 +48,10 @@ func (s *GitoliteSuite) SetUpTest(c *check.C) {
                        APIHost:  arvadostest.APIHost(),
                        Insecure: true,
                },
-               Listen:     ":0",
-               GitCommand: "/usr/share/gitolite3/gitolite-shell",
-               RepoRoot:   s.tmpRepoRoot,
+               Listen:       ":0",
+               GitCommand:   "/usr/share/gitolite3/gitolite-shell",
+               GitoliteHome: s.gitoliteHome,
+               RepoRoot:     s.tmpRepoRoot,
        }
        s.IntegrationSuite.SetUpTest(c)
 
@@ -58,9 +59,6 @@ func (s *GitoliteSuite) SetUpTest(c *check.C) {
        // (*IntegrationTest)SetUpTest() -- see 2.2.4 at
        // http://gitolite.com/gitolite/gitolite.html
        runGitolite("gitolite", "setup")
-
-       os.Setenv("GITOLITE_HTTP_HOME", s.gitoliteHome)
-       os.Setenv("GL_BYPASS_ACCESS_CHECKS", "1")
 }
 
 func (s *GitoliteSuite) TearDownTest(c *check.C) {
index 5e55eca754838d97d2aaa8888482c686306a42cf..1d252599cdf3078b9924318980d91e031feb687d 100644 (file)
@@ -112,6 +112,8 @@ func (s *IntegrationSuite) TearDownTest(c *check.C) {
        s.tmpWorkdir = ""
 
        s.Config = nil
+
+       theConfig = defaultConfig()
 }
 
 func (s *IntegrationSuite) RunGit(c *check.C, token, gitCmd, repo string, args ...string) error {
index dd281366b29ac886365056ad8c2c4e2250a0d739..75645ff47215c2b5f7f666057006ea2510f99811 100644 (file)
@@ -14,27 +14,24 @@ import (
 
 // Server configuration
 type Config struct {
-       Client     arvados.Client
-       Listen     string
-       GitCommand string
-       RepoRoot   string
+       Client       arvados.Client
+       Listen       string
+       GitCommand   string
+       RepoRoot     string
+       GitoliteHome string
 }
 
 var theConfig = defaultConfig()
 
 func defaultConfig() *Config {
-       cwd, err := os.Getwd()
-       if err != nil {
-               log.Fatalln("Getwd():", err)
-       }
        return &Config{
                Listen:     ":80",
                GitCommand: "/usr/bin/git",
-               RepoRoot:   cwd,
+               RepoRoot:   "/var/lib/arvados/git/repositories",
        }
 }
 
-func init() {
+func main() {
        const defaultCfgPath = "/etc/arvados/git-httpd/git-httpd.yml"
        const deprecated = " (DEPRECATED -- use config file instead)"
        flag.StringVar(&theConfig.Listen, "address", theConfig.Listen,
@@ -43,6 +40,8 @@ func init() {
                "Path to git or gitolite-shell executable. Each authenticated request will execute this program with a single argument, \"http-backend\"."+deprecated)
        flag.StringVar(&theConfig.RepoRoot, "repo-root", theConfig.RepoRoot,
                "Path to git repositories."+deprecated)
+       flag.StringVar(&theConfig.GitoliteHome, "gitolite-home", theConfig.GitoliteHome,
+               "Value for GITOLITE_HTTP_HOME environment variable. If not empty, GL_BYPASS_ACCESS_CHECKS=1 will also be set."+deprecated)
 
        cfgPath := flag.String("config", defaultCfgPath, "Configuration file `path`.")
        flag.Usage = usage
@@ -63,14 +62,12 @@ func init() {
                        log.Print("Current configuration:\n", string(j))
                }
        }
-}
 
-func main() {
        srv := &server{}
        if err := srv.Start(); err != nil {
                log.Fatal(err)
        }
-       if _, err := daemon.SdNotify("READY=1"); err != nil {
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
                log.Printf("Error notifying init daemon: %v", err)
        }
        log.Println("Listening at", srv.Addr)
index 666edc01aa54f8a3ae0545809403a69be7850f20..1fb25b92f2f17286c576203f609e20ec82f3b300 100644 (file)
@@ -1,33 +1,40 @@
+// arvados-git-httpd provides authenticated access to Arvados-hosted
+// git repositories.
+//
+// See http://doc.arvados.org/install/install-arv-git-httpd.html.
 package main
 
 import (
-       "encoding/json"
        "flag"
        "fmt"
        "os"
+
+       "github.com/ghodss/yaml"
 )
 
 func usage() {
        c := defaultConfig()
        c.Client.APIHost = "zzzzz.arvadosapi.com:443"
-       exampleConfigFile, err := json.MarshalIndent(c, "    ", "  ")
+       exampleConfigFile, err := yaml.Marshal(c)
        if err != nil {
                panic(err)
        }
        fmt.Fprintf(os.Stderr, `
 
-arv-git-httpd provides authenticated access to Arvados-hosted git repositories.
+arvados-git-httpd provides authenticated access to Arvados-hosted git
+repositories.
 
 See http://doc.arvados.org/install/install-arv-git-httpd.html.
 
-Usage: arv-git-httpd [-config path/to/arv-git-httpd.yml]
+Usage: arvados-git-httpd [-config path/to/arvados/git-httpd.yml]
 
 Options:
 `)
        flag.PrintDefaults()
        fmt.Fprintf(os.Stderr, `
 Example config file:
-    %s
+
+%s
 
 Client.APIHost:
 
@@ -42,21 +49,29 @@ Client.Insecure:
     True if your Arvados API endpoint uses an unverifiable SSL/TLS
     certificate.
 
-Listen:
-
-    Local port to listen on. Can be "address:port" or ":port", where
-    "address" is a host IP address or name and "port" is a port number
-    or name.
-
 GitCommand:
 
     Path to git or gitolite-shell executable. Each authenticated
     request will execute this program with the single argument
     "http-backend".
 
+GitoliteHome:
+
+    Path to Gitolite's home directory. If a non-empty path is given,
+    the CGI environment will be set up to support the use of
+    gitolite-shell as a GitCommand: for example, if GitoliteHome is
+    "/gh", then the CGI environment will have GITOLITE_HTTP_HOME=/gh,
+    PATH=$PATH:/gh/bin, and GL_BYPASS_ACCESS_CHECKS=1.
+
+Listen:
+
+    Local port to listen on. Can be "address:port" or ":port", where
+    "address" is a host IP address or name and "port" is a port number
+    or name.
+
 RepoRoot:
 
-    Path to git repositories. Defaults to current working directory.
+    Path to git repositories.
 
 `, exampleConfigFile)
 }
index f45cc823ec7c87d310609f6d33073c4d82f8b662..3c4f281912842a0ceedb6df409aa61e80fa38fa2 100644 (file)
@@ -79,9 +79,9 @@ func doMain() error {
                // propagated to crunch-run via SLURM.
                os.Setenv("ARVADOS_API_HOST", theConfig.Client.APIHost)
                os.Setenv("ARVADOS_API_TOKEN", theConfig.Client.AuthToken)
-               os.Setenv("ARVADOS_API_INSECURE", "")
+               os.Setenv("ARVADOS_API_HOST_INSECURE", "")
                if theConfig.Client.Insecure {
-                       os.Setenv("ARVADOS_API_INSECURE", "1")
+                       os.Setenv("ARVADOS_API_HOST_INSECURE", "1")
                }
                os.Setenv("ARVADOS_KEEP_SERVICES", strings.Join(theConfig.Client.KeepServiceURIs, " "))
                os.Setenv("ARVADOS_EXTERNAL_CLIENT", "")
@@ -105,7 +105,7 @@ func doMain() error {
                PollInterval:   time.Duration(theConfig.PollPeriod),
                DoneProcessing: make(chan struct{})}
 
-       if _, err := daemon.SdNotify("READY=1"); err != nil {
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
                log.Printf("Error notifying init daemon: %v", err)
        }
 
@@ -127,8 +127,8 @@ func sbatchFunc(container arvados.Container) *exec.Cmd {
        sbatchArgs = append(sbatchArgs, fmt.Sprintf("--job-name=%s", container.UUID))
        sbatchArgs = append(sbatchArgs, fmt.Sprintf("--mem-per-cpu=%d", int(memPerCPU)))
        sbatchArgs = append(sbatchArgs, fmt.Sprintf("--cpus-per-task=%d", container.RuntimeConstraints.VCPUs))
-       if container.RuntimeConstraints.Partition != nil {
-               sbatchArgs = append(sbatchArgs, fmt.Sprintf("--partition=%s", strings.Join(container.RuntimeConstraints.Partition, ",")))
+       if container.SchedulingParameters.Partitions != nil {
+               sbatchArgs = append(sbatchArgs, fmt.Sprintf("--partition=%s", strings.Join(container.SchedulingParameters.Partitions, ",")))
        }
 
        return exec.Command("sbatch", sbatchArgs...)
@@ -183,9 +183,10 @@ func submit(dispatcher *dispatch.Dispatcher,
        squeueUpdater.SlurmLock.Lock()
        defer squeueUpdater.SlurmLock.Unlock()
 
+       log.Printf("sbatch starting: %+q", cmd.Args)
        err := cmd.Start()
        if err != nil {
-               submitErr = fmt.Errorf("Error starting %v: %v", cmd.Args, err)
+               submitErr = fmt.Errorf("Error starting sbatch: %v", err)
                return
        }
 
index c9208a6943924a1604c7b15735536229cde68104..fbea48e548a59f78718cb0afa419b5a84a1cd89b 100644 (file)
@@ -318,7 +318,7 @@ func testSbatchFuncWithArgs(c *C, args []string) {
 
 func (s *MockArvadosServerSuite) TestSbatchPartition(c *C) {
        theConfig.SbatchArguments = nil
-       container := arvados.Container{UUID: "123", RuntimeConstraints: arvados.RuntimeConstraints{RAM: 250000000, VCPUs: 1, Partition: []string{"blurb", "b2"}}}
+       container := arvados.Container{UUID: "123", RuntimeConstraints: arvados.RuntimeConstraints{RAM: 250000000, VCPUs: 1}, SchedulingParameters: arvados.SchedulingParameters{Partitions: []string{"blurb", "b2"}}}
        sbatchCmd := sbatchFunc(container)
 
        var expected []string
index fafa3c36073c2408c6265af8afef01bffbe2e44d..61decde61c4bd61d0a92e96bde20ff0c82780f57 100644 (file)
@@ -45,7 +45,11 @@ func (squeue *Squeue) RunSqueue() {
                log.Printf("Error creating stdout pipe for squeue: %v", err)
                return
        }
-       cmd.Start()
+       err = cmd.Start()
+       if err != nil {
+               log.Printf("Error running squeue: %v", err)
+               return
+       }
        scanner := bufio.NewScanner(sq)
        for scanner.Scan() {
                newSqueueContents = append(newSqueueContents, scanner.Text())
index d804c01cad16700bc2b9ca52e3ff561499328095..ade40c6b03a4d4a98812172aab31da5173453c4e 100644 (file)
@@ -250,6 +250,11 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
        pdhOnly := true
        tmpcount := 0
        arvMountCmd := []string{"--foreground", "--allow-other", "--read-write"}
+
+       if runner.Container.RuntimeConstraints.KeepCacheRAM > 0 {
+               arvMountCmd = append(arvMountCmd, "--file-cache", fmt.Sprintf("%d", runner.Container.RuntimeConstraints.KeepCacheRAM))
+       }
+
        collectionPaths := []string{}
        runner.Binds = nil
 
@@ -563,6 +568,21 @@ func (runner *ContainerRunner) CaptureOutput() error {
                return nil
        }
 
+       if wantAPI := runner.Container.RuntimeConstraints.API; wantAPI != nil && *wantAPI {
+               // Output may have been set directly by the container, so
+               // refresh the container record to check.
+               err := runner.ArvClient.Get("containers", runner.Container.UUID,
+                       nil, &runner.Container)
+               if err != nil {
+                       return err
+               }
+               if runner.Container.Output != "" {
+                       // Container output is already set.
+                       runner.OutputPDH = &runner.Container.Output
+                       return nil
+               }
+       }
+
        if runner.HostOutputDir == "" {
                return nil
        }
index 0ce658721eaf63675ff0e132eb6d59ffb3f00587..2c7145998ab402786e1f9bf47bfa5575afb1c086 100644 (file)
@@ -69,6 +69,7 @@ type TestDockerClient struct {
        stop        chan bool
        cwd         string
        env         []string
+       api         *ArvTestClient
 }
 
 func NewTestDockerClient() *TestDockerClient {
@@ -527,6 +528,7 @@ func FullRunHelper(c *C, record string, fn func(t *TestDockerClient)) (api *ArvT
        docker.RemoveImage(hwImageId, true)
 
        api = &ArvTestClient{Container: rec}
+       docker.api = api
        cr = NewContainerRunner(api, &KeepTestClient{}, docker, "zzzzz-zzzzz-zzzzzzzzzzzzzzz")
        cr.statInterval = 100 * time.Millisecond
        am := &ArvMountCmdLine{}
@@ -840,6 +842,28 @@ func (s *TestSuite) TestSetupMounts(c *C) {
                checkEmpty()
        }
 
+       {
+               i = 0
+               cr.Container.RuntimeConstraints.KeepCacheRAM = 512
+               cr.Container.Mounts = map[string]arvados.Mount{
+                       "/keepinp": {Kind: "collection", PortableDataHash: "59389a8f9ee9d399be35462a0f92541c+53"},
+                       "/keepout": {Kind: "collection", Writable: true},
+               }
+               cr.OutputPath = "/keepout"
+
+               os.MkdirAll(realTemp+"/keep1/by_id/59389a8f9ee9d399be35462a0f92541c+53", os.ModePerm)
+               os.MkdirAll(realTemp+"/keep1/tmp0", os.ModePerm)
+
+               err := cr.SetupMounts()
+               c.Check(err, IsNil)
+               c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--file-cache", "512", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", realTemp + "/keep1"})
+               sort.StringSlice(cr.Binds).Sort()
+               c.Check(cr.Binds, DeepEquals, []string{realTemp + "/keep1/by_id/59389a8f9ee9d399be35462a0f92541c+53:/keepinp:ro",
+                       realTemp + "/keep1/tmp0:/keepout"})
+               cr.CleanupDirs()
+               checkEmpty()
+       }
+
        for _, test := range []struct {
                in  interface{}
                out string
@@ -935,3 +959,50 @@ func (s *TestSuite) TestStdoutWithWrongKindCollection(c *C) {
        c.Check(err, NotNil)
        c.Check(strings.Contains(err.Error(), "Unsupported mount kind 'collection' for stdout"), Equals, true)
 }
+
+func (s *TestSuite) TestFullRunWithAPI(c *C) {
+       os.Setenv("ARVADOS_API_HOST", "test.arvados.org")
+       defer os.Unsetenv("ARVADOS_API_HOST")
+       api, _ := FullRunHelper(c, `{
+    "command": ["/bin/sh", "-c", "echo $ARVADOS_API_HOST"],
+    "container_image": "d4ab34d3d4f8a72f5c4973051ae69fab+122",
+    "cwd": "/bin",
+    "environment": {},
+    "mounts": {"/tmp": {"kind": "tmp"} },
+    "output_path": "/tmp",
+    "priority": 1,
+    "runtime_constraints": {"API": true}
+}`, func(t *TestDockerClient) {
+               t.logWriter.Write(dockerLog(1, t.env[1][17:]+"\n"))
+               t.logWriter.Close()
+               t.finish <- dockerclient.WaitResult{ExitCode: 0}
+       })
+
+       c.Check(api.CalledWith("container.exit_code", 0), NotNil)
+       c.Check(api.CalledWith("container.state", "Complete"), NotNil)
+       c.Check(strings.HasSuffix(api.Logs["stdout"].String(), "test.arvados.org\n"), Equals, true)
+       c.Check(api.CalledWith("container.output", "d41d8cd98f00b204e9800998ecf8427e+0"), NotNil)
+}
+
+func (s *TestSuite) TestFullRunSetOutput(c *C) {
+       os.Setenv("ARVADOS_API_HOST", "test.arvados.org")
+       defer os.Unsetenv("ARVADOS_API_HOST")
+       api, _ := FullRunHelper(c, `{
+    "command": ["/bin/sh", "-c", "echo $ARVADOS_API_HOST"],
+    "container_image": "d4ab34d3d4f8a72f5c4973051ae69fab+122",
+    "cwd": "/bin",
+    "environment": {},
+    "mounts": {"/tmp": {"kind": "tmp"} },
+    "output_path": "/tmp",
+    "priority": 1,
+    "runtime_constraints": {"API": true}
+}`, func(t *TestDockerClient) {
+               t.api.Container.Output = "d4ab34d3d4f8a72f5c4973051ae69fab+122"
+               t.logWriter.Close()
+               t.finish <- dockerclient.WaitResult{ExitCode: 0}
+       })
+
+       c.Check(api.CalledWith("container.exit_code", 0), NotNil)
+       c.Check(api.CalledWith("container.state", "Complete"), NotNil)
+       c.Check(api.CalledWith("container.output", "d4ab34d3d4f8a72f5c4973051ae69fab+122"), NotNil)
+}
index 28653ae24ef153658484d5628cfeecdaea63f0dd..031058242a21179f15a0ef36ce9456f657811338 100644 (file)
@@ -6,9 +6,14 @@ AssertPathExists=/etc/arvados/docker-cleaner/docker-cleaner.json
 
 [Service]
 Type=simple
-ExecStart=/usr/bin/env arvados-docker-cleaner
 Restart=always
 RestartSec=10s
+RestartPreventExitStatus=2
+#
+# This unwieldy ExecStart command detects at runtime whether
+# arvados-docker-cleaner is installed with the Python 3.3 Software
+# Collection, and if so, invokes it with the "scl" wrapper.
+ExecStart=/bin/sh -c 'if [ -e /opt/rh/python33/root/bin/arvados-docker-cleaner ]; then exec scl enable python33 arvados-docker-cleaner; else exec arvados-docker-cleaner; fi'
 
 [Install]
 WantedBy=multi-user.target
index 5ac81004ace90c6a2b374d36b2af30d7eb5a2139..b03b9e50ffaa47921341305673975ea24b1bcac0 100755 (executable)
@@ -17,6 +17,8 @@ import time
 import docker
 import json
 
+DEFAULT_CONFIG_FILE = '/etc/arvados/docker-cleaner/docker-cleaner.json'
+
 SUFFIX_SIZES = {suffix: 1024 ** exp for exp, suffix in enumerate('kmgt', 1)}
 
 logger = logging.getLogger('arvados_docker.cleaner')
@@ -262,7 +264,14 @@ def load_config(arguments):
             c = json.load(f)
             config.update(c)
     except (FileNotFoundError, IOError, ValueError) as error:
-        sys.exit('error reading config file {}: {}'.format(args.config, error))
+        if (isinstance(error, FileNotFoundError) and
+            args.config == DEFAULT_CONFIG_FILE):
+            logger.warning("DEPRECATED: default config file %s not found; "
+                           "relying on command line configuration",
+                           repr(DEFAULT_CONFIG_FILE))
+        else:
+            sys.exit('error reading config file {}: {}'.format(
+                args.config, error))
 
     configargs = vars(args).copy()
     configargs.pop('config')
@@ -294,7 +303,7 @@ def parse_arguments(arguments):
         formatter_class=Formatter,
     )
     parser.add_argument(
-        '--config', action='store', type=str, default='/etc/arvados/docker-cleaner/docker-cleaner.json',
+        '--config', action='store', type=str, default=DEFAULT_CONFIG_FILE,
         help="configuration file")
 
     deprecated = " (DEPRECATED -- use config file instead)"
@@ -314,12 +323,15 @@ def parse_arguments(arguments):
     return parser.parse_args(arguments)
 
 
-def setup_logging(config):
+def setup_logging():
     log_handler = logging.StreamHandler()
     log_handler.setFormatter(logging.Formatter(
         '%(asctime)s %(name)s[%(process)d] %(levelname)s: %(message)s',
         '%Y-%m-%d %H:%M:%S'))
     logger.addHandler(log_handler)
+
+
+def configure_logging(config):
     logger.setLevel(logging.ERROR - (10 * config['Verbose']))
 
 
@@ -342,8 +354,9 @@ def run(config, docker_client):
 
 
 def main(arguments=sys.argv[1:]):
+    setup_logging()
     config = load_config(arguments)
-    setup_logging(config)
+    configure_logging(config)
     try:
         run(config, docker.Client(version='1.14'))
     except KeyboardInterrupt:
index 535650e3fa3f35bcbef48240727c7746e68eb7f8..7b7a471580788ca9ab857d1e5a9ba648af7c0077 100644 (file)
@@ -29,6 +29,7 @@ setup(name="arvados-docker-cleaner",
       ],
       install_requires=[
           'docker-py==1.7.2',
+          'setuptools',
       ],
       tests_require=[
           'pbr<1.7.0',
index 9fbd3e3014ecd0038d789d64ce3660d872268f6c..37c1d7600e34f9699b7788c0a76663173978d46f 100644 (file)
@@ -3,6 +3,7 @@
 import collections
 import itertools
 import json
+import os
 import random
 import tempfile
 import time
@@ -437,6 +438,11 @@ class ConfigTestCase(unittest.TestCase):
         self.assertEqual('never', config['RemoveStoppedContainers'])
         self.assertEqual(1, config['Verbose'])
 
+    def test_args_no_config(self):
+        self.assertEqual(False, os.path.exists(cleaner.DEFAULT_CONFIG_FILE))
+        config = cleaner.load_config(['--quota', '1G'])
+        self.assertEqual(1 << 30, config['Quota'])
+
 
 class ContainerRemovalTestCase(unittest.TestCase):
     LIFECYCLE = ['create', 'attach', 'start', 'resize', 'die', 'destroy']
index 527e02728bdd711c2deb6ef19573d223c9101e0a..1828e150bb76bdf6185f7fcbb3fe3172fb68e616 100644 (file)
@@ -367,9 +367,10 @@ class Operations(llfuse.Operations):
         return True
 
     def listen_for_events(self):
-        self.events = arvados.events.subscribe(self._api_client,
-                                 [["event_type", "in", ["create", "update", "delete"]]],
-                                 self.on_event)
+        self.events = arvados.events.subscribe(
+            self._api_client,
+            [["event_type", "in", ["create", "update", "delete"]]],
+            self.on_event)
 
     @catch_exceptions
     def on_event(self, ev):
@@ -511,6 +512,20 @@ class Operations(llfuse.Operations):
         self._filehandles[fh] = FileHandle(fh, p)
         self.inodes.touch(p)
 
+        # Normally, we will have received an "update" event if the
+        # parent collection is stale here. However, even if the parent
+        # collection hasn't changed, the manifest might have been
+        # fetched so long ago that the signatures on the data block
+        # locators have expired. Calling checkupdate() on all
+        # ancestors ensures the signatures will be refreshed if
+        # necessary.
+        while p.parent_inode in self.inodes:
+            if p == self.inodes[p.parent_inode]:
+                break
+            p = self.inodes[p.parent_inode]
+            self.inodes.touch(p)
+            p.checkupdate()
+
         _logger.debug("arv-mount open inode %i flags %x fh %i", inode, flags, fh)
 
         return fh
index d15f01792a8e8dd4b433611ce20a752c1138c877..3f89732bea25dcd1ca546fbef126227e9e0a9256 100644 (file)
@@ -77,6 +77,8 @@ class ArgumentParser(argparse.ArgumentParser):
         self.add_argument('--file-cache', type=int, help="File data cache size, in bytes (default 256MiB)", default=256*1024*1024)
         self.add_argument('--directory-cache', type=int, help="Directory data cache size, in bytes (default 128MiB)", default=128*1024*1024)
 
+        self.add_argument('--disable-event-listening', action='store_true', help="Don't subscribe to events on the API server", dest="disable_event_listening", default=False)
+
         self.add_argument('--read-only', action='store_false', help="Mount will be read only (default)", dest="enable_write", default=False)
         self.add_argument('--read-write', action='store_true', help="Mount will be read-write", dest="enable_write", default=False)
 
@@ -111,7 +113,7 @@ class Mount(object):
 
     def __enter__(self):
         llfuse.init(self.operations, self.args.mountpoint, self._fuse_options())
-        if self.listen_for_events:
+        if self.listen_for_events and not self.args.disable_event_listening:
             self.operations.listen_for_events()
         self.llfuse_thread = threading.Thread(None, lambda: self._llfuse_main())
         self.llfuse_thread.daemon = True
@@ -330,7 +332,7 @@ From here, the following directories are available:
                 self.daemon_ctx.open()
 
             # Subscribe to change events from API server
-            if self.listen_for_events:
+            if self.listen_for_events and not self.args.disable_event_listening:
                 self.operations.listen_for_events()
 
             self._llfuse_main()
index b485037c8cdfe5b897d2de64f42aeaba9ba3ea20..c79b1314cd906bf0067b0b3fac3f23b4aa0b0809 100644 (file)
@@ -61,7 +61,6 @@ class IntegrationTest(unittest.TestCase):
     def setUp(self):
         self.mnt = tempfile.mkdtemp()
         run_test_server.authorize_with('active')
-        self.api = arvados.safeapi.ThreadSafeApiCache(arvados.config.settings())
 
     def tearDown(self):
         os.rmdir(self.mnt)
index bb80d0a2fc94dc4c77c0f46f59414a8d00627235..e8488d7ff967179423f3732c8e6e56b05194ed58 100644 (file)
@@ -170,6 +170,20 @@ class MountArgsTest(unittest.TestCase):
                          run_test_server.fixture('users')['active']['uuid'])
         self.assertEqual(True, self.mnt.listen_for_events)
 
+    @noexit
+    @mock.patch('arvados.events.subscribe')
+    def test_disable_event_listening(self, mock_subscribe):
+        args = arvados_fuse.command.ArgumentParser().parse_args([
+            '--disable-event-listening',
+            '--by-id',
+            '--foreground', self.mntdir])
+        self.mnt = arvados_fuse.command.Mount(args)
+        self.assertEqual(True, self.mnt.listen_for_events)
+        self.assertEqual(True, self.mnt.args.disable_event_listening)
+        with self.mnt:
+            pass
+        self.assertEqual(0, mock_subscribe.call_count)
+
     @noexit
     @mock.patch('arvados.events.subscribe')
     def test_custom(self, mock_subscribe):
index 8b6d01969a7819f52975c511f1d7a954aaaa324d..4c70ce98d3d36bb2d28f77b3ad30a5bbfda42238 100644 (file)
@@ -1151,36 +1151,3 @@ class FuseMagicTestPDHOnly(MountTestBase):
 
     def test_with_default_by_id(self):
         self.verify_pdh_only(skip_pdh_only=True)
-
-def _test_refresh_old_manifest(zzz):
-    fnm = 'zzzzz-8i9sb-0vsrcqi7whchuil.log.txt'
-    os.listdir(os.path.join(zzz))
-    time.sleep(3)
-    with open(os.path.join(zzz, fnm)) as f:
-        f.read()
-
-class TokenExpiryTest(MountTestBase):
-    def setUp(self):
-        super(TokenExpiryTest, self).setUp(local_store=False)
-
-    @mock.patch('arvados.keep.KeepClient.get')
-    def runTest(self, mocked_get):
-        self.api._rootDesc = {"blobSignatureTtl": 2}
-        mnt = self.make_mount(fuse.CollectionDirectory, collection_record='zzzzz-4zz18-op4e2lbej01tcvu')
-        mocked_get.return_value = 'fake data'
-
-        old_exp = int(time.time()) + 86400*14
-        self.pool.apply(_test_refresh_old_manifest, (self.mounttmp,))
-        want_exp = int(time.time()) + 86400*14
-
-        got_loc = mocked_get.call_args[0][0]
-        got_exp = int(
-            re.search(r'\+A[0-9a-f]+@([0-9a-f]+)', got_loc).group(1),
-            16)
-        self.assertGreaterEqual(
-            got_exp, want_exp-2,
-            msg='now+2w = {:x}, but fuse fetched locator {} (old_exp {:x})'.format(
-                want_exp, got_loc, old_exp))
-        self.assertLessEqual(
-            got_exp, want_exp,
-            msg='server is not using the expected 2w TTL; test is ineffective')
diff --git a/services/fuse/tests/test_token_expiry.py b/services/fuse/tests/test_token_expiry.py
new file mode 100644 (file)
index 0000000..e082e52
--- /dev/null
@@ -0,0 +1,68 @@
+import apiclient
+import arvados
+import arvados_fuse
+import logging
+import mock
+import multiprocessing
+import os
+import re
+import sys
+import time
+import unittest
+
+from .integration_test import IntegrationTest
+
+logger = logging.getLogger('arvados.arv-mount')
+
+class TokenExpiryTest(IntegrationTest):
+    def setUp(self):
+        super(TokenExpiryTest, self).setUp()
+        self.test_start_time = time.time()
+        self.time_now = int(time.time())+1
+
+    def fake_time(self):
+        self.time_now += 1
+        return self.time_now
+
+    orig_open = arvados_fuse.Operations.open
+    def fake_open(self, operations, *args, **kwargs):
+        self.time_now += 86400*13
+        logger.debug('opening file at time=%f', self.time_now)
+        return self.orig_open(operations, *args, **kwargs)
+
+    @mock.patch.object(arvados_fuse.Operations, 'open', autospec=True)
+    @mock.patch('time.time')
+    @mock.patch('arvados.keep.KeepClient.get')
+    @IntegrationTest.mount(argv=['--mount-by-id', 'zzz'])
+    def test_refresh_old_manifest(self, mocked_get, mocked_time, mocked_open):
+        # This test (and associated behavior) is still not strong
+        # enough. We should ensure old tokens are never used even if
+        # blobSignatureTtl seconds elapse between open() and
+        # read(). See https://dev.arvados.org/issues/10008
+
+        mocked_get.return_value = 'fake data'
+        mocked_time.side_effect = self.fake_time
+        mocked_open.side_effect = self.fake_open
+
+        with mock.patch.object(self.mount.api, 'collections', wraps=self.mount.api.collections) as mocked_collections:
+            mocked_collections.return_value = mocked_collections()
+            with mock.patch.object(self.mount.api.collections(), 'get', wraps=self.mount.api.collections().get) as mocked_get:
+                self.pool_test(os.path.join(self.mnt, 'zzz'))
+
+        # open() several times here to make sure we don't reach our
+        # quota of mocked_get.call_count dishonestly (e.g., the first
+        # open causes 5 mocked_get, and the rest cause none).
+        self.assertEqual(8, mocked_open.call_count)
+        self.assertGreaterEqual(
+            mocked_get.call_count, 8,
+            'Not enough calls to collections().get(): expected 8, got {!r}'.format(
+                mocked_get.mock_calls))
+
+    @staticmethod
+    def _test_refresh_old_manifest(self, zzz):
+        uuid = 'zzzzz-4zz18-op4e2lbej01tcvu'
+        fnm = 'zzzzz-8i9sb-0vsrcqi7whchuil.log.txt'
+        os.listdir(os.path.join(zzz, uuid))
+        for _ in range(8):
+            with open(os.path.join(zzz, uuid, fnm)) as f:
+                f.read()
index 13d8c1b329ab6583fec2a3d4f281d61a55036ca2..df8a0b5c078b31d3a42b51786e3d4f6d0f15477f 100644 (file)
@@ -83,7 +83,7 @@ func main() {
        if err := srv.Start(); err != nil {
                log.Fatal(err)
        }
-       if _, err := daemon.SdNotify("READY=1"); err != nil {
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
                log.Printf("Error notifying init daemon: %v", err)
        }
        log.Println("Listening at", srv.Addr)
index 816de29da8abc4bad7ddcf22afcb572a7b16da69..24df531fa4ab434fea7652503db1d44f1ba04a9b 100644 (file)
@@ -131,7 +131,7 @@ func main() {
        if err != nil {
                log.Fatalf("listen(%s): %s", cfg.Listen, err)
        }
-       if _, err := daemon.SdNotify("READY=1"); err != nil {
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
                log.Printf("Error notifying init daemon: %v", err)
        }
        log.Println("Listening at", listener.Addr())
index 48cb02647cfd098cdc67796ba992ac5cba327bde..6ca31c38329ec7347631a03c802b4216bd05f167 100644 (file)
@@ -2,12 +2,14 @@ package main
 
 import (
        "bytes"
+       "context"
        "errors"
        "flag"
        "fmt"
        "io"
        "io/ioutil"
        "log"
+       "net/http"
        "os"
        "regexp"
        "strconv"
@@ -15,9 +17,12 @@ import (
        "sync"
        "time"
 
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
        "github.com/curoverse/azure-sdk-for-go/storage"
 )
 
+const azureDefaultRequestTimeout = arvados.Duration(10 * time.Minute)
+
 var (
        azureMaxGetBytes           int
        azureStorageAccountName    string
@@ -40,41 +45,29 @@ func readKeyFromFile(file string) (string, error) {
 }
 
 type azureVolumeAdder struct {
-       *volumeSet
+       *Config
 }
 
-func (s *azureVolumeAdder) Set(containerName string) error {
-       if trashLifetime != 0 {
-               return ErrNotImplemented
-       }
+// String implements flag.Value
+func (s *azureVolumeAdder) String() string {
+       return "-"
+}
 
-       if containerName == "" {
-               return errors.New("no container name given")
-       }
-       if azureStorageAccountName == "" || azureStorageAccountKeyFile == "" {
-               return errors.New("-azure-storage-account-name and -azure-storage-account-key-file arguments must given before -azure-storage-container-volume")
-       }
-       accountKey, err := readKeyFromFile(azureStorageAccountKeyFile)
-       if err != nil {
-               return err
-       }
-       azClient, err := storage.NewBasicClient(azureStorageAccountName, accountKey)
-       if err != nil {
-               return errors.New("creating Azure storage client: " + err.Error())
-       }
-       if flagSerializeIO {
-               log.Print("Notice: -serialize is not supported by azure-blob-container volumes.")
-       }
-       v := NewAzureBlobVolume(azClient, containerName, flagReadonly, azureStorageReplication)
-       if err := v.Check(); err != nil {
-               return err
-       }
-       *s.volumeSet = append(*s.volumeSet, v)
+func (s *azureVolumeAdder) Set(containerName string) error {
+       s.Config.Volumes = append(s.Config.Volumes, &AzureBlobVolume{
+               ContainerName:         containerName,
+               StorageAccountName:    azureStorageAccountName,
+               StorageAccountKeyFile: azureStorageAccountKeyFile,
+               AzureReplication:      azureStorageReplication,
+               ReadOnly:              deprecated.flagReadonly,
+       })
        return nil
 }
 
 func init() {
-       flag.Var(&azureVolumeAdder{&volumes},
+       VolumeTypes = append(VolumeTypes, func() VolumeWithExamples { return &AzureBlobVolume{} })
+
+       flag.Var(&azureVolumeAdder{theConfig},
                "azure-storage-container-volume",
                "Use the given container as a storage volume. Can be given multiple times.")
        flag.StringVar(
@@ -86,7 +79,7 @@ func init() {
                &azureStorageAccountKeyFile,
                "azure-storage-account-key-file",
                "",
-               "File containing the account key used for subsequent --azure-storage-container-volume arguments.")
+               "`File` containing the account key used for subsequent --azure-storage-container-volume arguments.")
        flag.IntVar(
                &azureStorageReplication,
                "azure-storage-replication",
@@ -102,41 +95,73 @@ func init() {
 // An AzureBlobVolume stores and retrieves blocks in an Azure Blob
 // container.
 type AzureBlobVolume struct {
-       azClient      storage.Client
-       bsClient      storage.BlobStorageClient
-       containerName string
-       readonly      bool
-       replication   int
+       StorageAccountName    string
+       StorageAccountKeyFile string
+       ContainerName         string
+       AzureReplication      int
+       ReadOnly              bool
+       RequestTimeout        arvados.Duration
+
+       azClient storage.Client
+       bsClient storage.BlobStorageClient
 }
 
-// NewAzureBlobVolume returns a new AzureBlobVolume using the given
-// client and container name. The replication argument specifies the
-// replication level to report when writing data.
-func NewAzureBlobVolume(client storage.Client, containerName string, readonly bool, replication int) *AzureBlobVolume {
-       return &AzureBlobVolume{
-               azClient:      client,
-               bsClient:      client.GetBlobService(),
-               containerName: containerName,
-               readonly:      readonly,
-               replication:   replication,
+// Examples implements VolumeWithExamples.
+func (*AzureBlobVolume) Examples() []Volume {
+       return []Volume{
+               &AzureBlobVolume{
+                       StorageAccountName:    "example-account-name",
+                       StorageAccountKeyFile: "/etc/azure_storage_account_key.txt",
+                       ContainerName:         "example-container-name",
+                       AzureReplication:      3,
+                       RequestTimeout:        azureDefaultRequestTimeout,
+               },
        }
 }
 
-// Check returns nil if the volume is usable.
-func (v *AzureBlobVolume) Check() error {
-       ok, err := v.bsClient.ContainerExists(v.containerName)
+// Type implements Volume.
+func (v *AzureBlobVolume) Type() string {
+       return "Azure"
+}
+
+// Start implements Volume.
+func (v *AzureBlobVolume) Start() error {
+       if v.ContainerName == "" {
+               return errors.New("no container name given")
+       }
+       if v.StorageAccountName == "" || v.StorageAccountKeyFile == "" {
+               return errors.New("StorageAccountName and StorageAccountKeyFile must be given")
+       }
+       accountKey, err := readKeyFromFile(v.StorageAccountKeyFile)
+       if err != nil {
+               return err
+       }
+       v.azClient, err = storage.NewBasicClient(v.StorageAccountName, accountKey)
+       if err != nil {
+               return fmt.Errorf("creating Azure storage client: %s", err)
+       }
+
+       if v.RequestTimeout == 0 {
+               v.RequestTimeout = azureDefaultRequestTimeout
+       }
+       v.azClient.HTTPClient = &http.Client{
+               Timeout: time.Duration(v.RequestTimeout),
+       }
+       v.bsClient = v.azClient.GetBlobService()
+
+       ok, err := v.bsClient.ContainerExists(v.ContainerName)
        if err != nil {
                return err
        }
        if !ok {
-               return errors.New("container does not exist")
+               return fmt.Errorf("Azure container %q does not exist", v.ContainerName)
        }
        return nil
 }
 
 // Return true if expires_at metadata attribute is found on the block
 func (v *AzureBlobVolume) checkTrashed(loc string) (bool, map[string]string, error) {
-       metadata, err := v.bsClient.GetBlobMetadata(v.containerName, loc)
+       metadata, err := v.bsClient.GetBlobMetadata(v.ContainerName, loc)
        if err != nil {
                return false, metadata, v.translateError(err)
        }
@@ -152,7 +177,7 @@ func (v *AzureBlobVolume) checkTrashed(loc string) (bool, map[string]string, err
 // If the block is younger than azureWriteRaceInterval and is
 // unexpectedly empty, assume a PutBlob operation is in progress, and
 // wait for it to finish writing.
-func (v *AzureBlobVolume) Get(loc string, buf []byte) (int, error) {
+func (v *AzureBlobVolume) Get(ctx context.Context, loc string, buf []byte) (int, error) {
        trashed, _, err := v.checkTrashed(loc)
        if err != nil {
                return 0, err
@@ -197,7 +222,7 @@ func (v *AzureBlobVolume) get(loc string, buf []byte) (int, error) {
        if azureMaxGetBytes < BlockSize {
                // Unfortunately the handler doesn't tell us how long the blob
                // is expected to be, so we have to ask Azure.
-               props, err := v.bsClient.GetBlobProperties(v.containerName, loc)
+               props, err := v.bsClient.GetBlobProperties(v.ContainerName, loc)
                if err != nil {
                        return 0, v.translateError(err)
                }
@@ -228,9 +253,9 @@ func (v *AzureBlobVolume) get(loc string, buf []byte) (int, error) {
                        var rdr io.ReadCloser
                        var err error
                        if startPos == 0 && endPos == expectSize {
-                               rdr, err = v.bsClient.GetBlob(v.containerName, loc)
+                               rdr, err = v.bsClient.GetBlob(v.ContainerName, loc)
                        } else {
-                               rdr, err = v.bsClient.GetBlobRange(v.containerName, loc, fmt.Sprintf("%d-%d", startPos, endPos-1), nil)
+                               rdr, err = v.bsClient.GetBlobRange(v.ContainerName, loc, fmt.Sprintf("%d-%d", startPos, endPos-1), nil)
                        }
                        if err != nil {
                                errors[p] = err
@@ -260,7 +285,7 @@ func (v *AzureBlobVolume) get(loc string, buf []byte) (int, error) {
 }
 
 // Compare the given data with existing stored data.
-func (v *AzureBlobVolume) Compare(loc string, expect []byte) error {
+func (v *AzureBlobVolume) Compare(ctx context.Context, loc string, expect []byte) error {
        trashed, _, err := v.checkTrashed(loc)
        if err != nil {
                return err
@@ -268,25 +293,25 @@ func (v *AzureBlobVolume) Compare(loc string, expect []byte) error {
        if trashed {
                return os.ErrNotExist
        }
-       rdr, err := v.bsClient.GetBlob(v.containerName, loc)
+       rdr, err := v.bsClient.GetBlob(v.ContainerName, loc)
        if err != nil {
                return v.translateError(err)
        }
        defer rdr.Close()
-       return compareReaderWithBuf(rdr, expect, loc[:32])
+       return compareReaderWithBuf(ctx, rdr, expect, loc[:32])
 }
 
 // Put stores a Keep block as a block blob in the container.
-func (v *AzureBlobVolume) Put(loc string, block []byte) error {
-       if v.readonly {
+func (v *AzureBlobVolume) Put(ctx context.Context, loc string, block []byte) error {
+       if v.ReadOnly {
                return MethodDisabledError
        }
-       return v.bsClient.CreateBlockBlobFromReader(v.containerName, loc, uint64(len(block)), bytes.NewReader(block), nil)
+       return v.bsClient.CreateBlockBlobFromReader(v.ContainerName, loc, uint64(len(block)), bytes.NewReader(block), nil)
 }
 
 // Touch updates the last-modified property of a block blob.
 func (v *AzureBlobVolume) Touch(loc string) error {
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
        trashed, metadata, err := v.checkTrashed(loc)
@@ -298,7 +323,7 @@ func (v *AzureBlobVolume) Touch(loc string) error {
        }
 
        metadata["touch"] = fmt.Sprintf("%d", time.Now())
-       return v.bsClient.SetBlobMetadata(v.containerName, loc, metadata, nil)
+       return v.bsClient.SetBlobMetadata(v.ContainerName, loc, metadata, nil)
 }
 
 // Mtime returns the last-modified property of a block blob.
@@ -311,7 +336,7 @@ func (v *AzureBlobVolume) Mtime(loc string) (time.Time, error) {
                return time.Time{}, os.ErrNotExist
        }
 
-       props, err := v.bsClient.GetBlobProperties(v.containerName, loc)
+       props, err := v.bsClient.GetBlobProperties(v.ContainerName, loc)
        if err != nil {
                return time.Time{}, err
        }
@@ -326,7 +351,7 @@ func (v *AzureBlobVolume) IndexTo(prefix string, writer io.Writer) error {
                Include: "metadata",
        }
        for {
-               resp, err := v.bsClient.ListBlobs(v.containerName, params)
+               resp, err := v.bsClient.ListBlobs(v.ContainerName, params)
                if err != nil {
                        return err
                }
@@ -361,7 +386,7 @@ func (v *AzureBlobVolume) IndexTo(prefix string, writer io.Writer) error {
 
 // Trash a Keep block.
 func (v *AzureBlobVolume) Trash(loc string) error {
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
 
@@ -370,26 +395,26 @@ func (v *AzureBlobVolume) Trash(loc string) error {
        // we get the Etag before checking Mtime, and use If-Match to
        // ensure we don't delete data if Put() or Touch() happens
        // between our calls to Mtime() and DeleteBlob().
-       props, err := v.bsClient.GetBlobProperties(v.containerName, loc)
+       props, err := v.bsClient.GetBlobProperties(v.ContainerName, loc)
        if err != nil {
                return err
        }
        if t, err := v.Mtime(loc); err != nil {
                return err
-       } else if time.Since(t) < blobSignatureTTL {
+       } else if time.Since(t) < theConfig.BlobSignatureTTL.Duration() {
                return nil
        }
 
-       // If trashLifetime == 0, just delete it
-       if trashLifetime == 0 {
-               return v.bsClient.DeleteBlob(v.containerName, loc, map[string]string{
+       // If TrashLifetime == 0, just delete it
+       if theConfig.TrashLifetime == 0 {
+               return v.bsClient.DeleteBlob(v.ContainerName, loc, map[string]string{
                        "If-Match": props.Etag,
                })
        }
 
        // Otherwise, mark as trash
-       return v.bsClient.SetBlobMetadata(v.containerName, loc, map[string]string{
-               "expires_at": fmt.Sprintf("%d", time.Now().Add(trashLifetime).Unix()),
+       return v.bsClient.SetBlobMetadata(v.ContainerName, loc, map[string]string{
+               "expires_at": fmt.Sprintf("%d", time.Now().Add(theConfig.TrashLifetime.Duration()).Unix()),
        }, map[string]string{
                "If-Match": props.Etag,
        })
@@ -399,7 +424,7 @@ func (v *AzureBlobVolume) Trash(loc string) error {
 // Delete the expires_at metadata attribute
 func (v *AzureBlobVolume) Untrash(loc string) error {
        // if expires_at does not exist, return NotFoundError
-       metadata, err := v.bsClient.GetBlobMetadata(v.containerName, loc)
+       metadata, err := v.bsClient.GetBlobMetadata(v.ContainerName, loc)
        if err != nil {
                return v.translateError(err)
        }
@@ -409,7 +434,7 @@ func (v *AzureBlobVolume) Untrash(loc string) error {
 
        // reset expires_at metadata attribute
        metadata["expires_at"] = ""
-       err = v.bsClient.SetBlobMetadata(v.containerName, loc, metadata, nil)
+       err = v.bsClient.SetBlobMetadata(v.ContainerName, loc, metadata, nil)
        return v.translateError(err)
 }
 
@@ -424,19 +449,19 @@ func (v *AzureBlobVolume) Status() *VolumeStatus {
 
 // String returns a volume label, including the container name.
 func (v *AzureBlobVolume) String() string {
-       return fmt.Sprintf("azure-storage-container:%+q", v.containerName)
+       return fmt.Sprintf("azure-storage-container:%+q", v.ContainerName)
 }
 
 // Writable returns true, unless the -readonly flag was on when the
 // volume was added.
 func (v *AzureBlobVolume) Writable() bool {
-       return !v.readonly
+       return !v.ReadOnly
 }
 
 // Replication returns the replication level of the container, as
 // specified by the -azure-storage-replication argument.
 func (v *AzureBlobVolume) Replication() int {
-       return v.replication
+       return v.AzureReplication
 }
 
 // If possible, translate an Azure SDK error to a recognizable error
@@ -459,7 +484,7 @@ func (v *AzureBlobVolume) isKeepBlock(s string) bool {
        return keepBlockRegexp.MatchString(s)
 }
 
-// EmptyTrash looks for trashed blocks that exceeded trashLifetime
+// EmptyTrash looks for trashed blocks that exceeded TrashLifetime
 // and deletes them from the volume.
 func (v *AzureBlobVolume) EmptyTrash() {
        var bytesDeleted, bytesInTrash int64
@@ -467,7 +492,7 @@ func (v *AzureBlobVolume) EmptyTrash() {
        params := storage.ListBlobsParameters{Include: "metadata"}
 
        for {
-               resp, err := v.bsClient.ListBlobs(v.containerName, params)
+               resp, err := v.bsClient.ListBlobs(v.ContainerName, params)
                if err != nil {
                        log.Printf("EmptyTrash: ListBlobs: %v", err)
                        break
@@ -491,7 +516,7 @@ func (v *AzureBlobVolume) EmptyTrash() {
                                continue
                        }
 
-                       err = v.bsClient.DeleteBlob(v.containerName, b.Name, map[string]string{
+                       err = v.bsClient.DeleteBlob(v.ContainerName, b.Name, map[string]string{
                                "If-Match": b.Properties.Etag,
                        })
                        if err != nil {
index 5d556b3e8c40eb242addf53f4996c49eb396138f..d636a5ee86887806372a14e2f291e5c4f2c11b33 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "crypto/md5"
        "encoding/base64"
        "encoding/xml"
@@ -365,7 +366,13 @@ func NewTestableAzureBlobVolume(t TB, readonly bool, replication int) *TestableA
                }
        }
 
-       v := NewAzureBlobVolume(azClient, container, readonly, replication)
+       v := &AzureBlobVolume{
+               ContainerName:    container,
+               ReadOnly:         readonly,
+               AzureReplication: replication,
+               azClient:         azClient,
+               bsClient:         azClient.GetBlobService(),
+       }
 
        return &TestableAzureBlobVolume{
                AzureBlobVolume: v,
@@ -448,12 +455,12 @@ func TestAzureBlobVolumeRangeFenceposts(t *testing.T) {
                        data[i] = byte((i + 7) & 0xff)
                }
                hash := fmt.Sprintf("%x", md5.Sum(data))
-               err := v.Put(hash, data)
+               err := v.Put(context.Background(), hash, data)
                if err != nil {
                        t.Error(err)
                }
                gotData := make([]byte, len(data))
-               gotLen, err := v.Get(hash, gotData)
+               gotLen, err := v.Get(context.Background(), hash, gotData)
                if err != nil {
                        t.Error(err)
                }
@@ -494,7 +501,7 @@ func TestAzureBlobVolumeCreateBlobRace(t *testing.T) {
        allDone := make(chan struct{})
        v.azHandler.race = make(chan chan struct{})
        go func() {
-               err := v.Put(TestHash, TestBlock)
+               err := v.Put(context.Background(), TestHash, TestBlock)
                if err != nil {
                        t.Error(err)
                }
@@ -504,7 +511,7 @@ func TestAzureBlobVolumeCreateBlobRace(t *testing.T) {
        v.azHandler.race <- continuePut
        go func() {
                buf := make([]byte, len(TestBlock))
-               _, err := v.Get(TestHash, buf)
+               _, err := v.Get(context.Background(), TestHash, buf)
                if err != nil {
                        t.Error(err)
                }
@@ -547,7 +554,7 @@ func TestAzureBlobVolumeCreateBlobRaceDeadline(t *testing.T) {
        go func() {
                defer close(allDone)
                buf := make([]byte, BlockSize)
-               n, err := v.Get(TestHash, buf)
+               n, err := v.Get(context.Background(), TestHash, buf)
                if err != nil {
                        t.Error(err)
                        return
@@ -570,11 +577,11 @@ func TestAzureBlobVolumeCreateBlobRaceDeadline(t *testing.T) {
 }
 
 func (v *TestableAzureBlobVolume) PutRaw(locator string, data []byte) {
-       v.azHandler.PutRaw(v.containerName, locator, data)
+       v.azHandler.PutRaw(v.ContainerName, locator, data)
 }
 
 func (v *TestableAzureBlobVolume) TouchWithDate(locator string, lastPut time.Time) {
-       v.azHandler.TouchWithDate(v.containerName, locator, lastPut)
+       v.azHandler.TouchWithDate(v.ContainerName, locator, lastPut)
 }
 
 func (v *TestableAzureBlobVolume) Teardown() {
index 7b51b643cea54ba0b5643a2bf84c4ccfed9bcd5f..bce82377b5d0c2a0d56cb8fa5011c7944ad6a5ea 100644 (file)
@@ -12,12 +12,12 @@ type BufferPoolSuite struct{}
 // Initialize a default-sized buffer pool for the benefit of test
 // suites that don't run main().
 func init() {
-       bufs = newBufferPool(maxBuffers, BlockSize)
+       bufs = newBufferPool(theConfig.MaxBuffers, BlockSize)
 }
 
 // Restore sane default after bufferpool's own tests
 func (s *BufferPoolSuite) TearDownTest(c *C) {
-       bufs = newBufferPool(maxBuffers, BlockSize)
+       bufs = newBufferPool(theConfig.MaxBuffers, BlockSize)
 }
 
 func (s *BufferPoolSuite) TestBufferPoolBufSize(c *C) {
index a4af563729b3cf0e72686a2913fd3664e497e24d..82cb789eb954c289172ac478dc04392a14c6a989 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "crypto/md5"
        "fmt"
        "io"
@@ -49,7 +50,7 @@ func collisionOrCorrupt(expectMD5 string, buf1, buf2 []byte, rdr io.Reader) erro
        return <-outcome
 }
 
-func compareReaderWithBuf(rdr io.Reader, expect []byte, hash string) error {
+func compareReaderWithBuf(ctx context.Context, rdr io.Reader, expect []byte, hash string) error {
        bufLen := 1 << 20
        if bufLen > len(expect) && len(expect) > 0 {
                // No need for bufLen to be longer than
@@ -67,7 +68,18 @@ func compareReaderWithBuf(rdr io.Reader, expect []byte, hash string) error {
        // expected to equal the next N bytes read from
        // rdr.
        for {
-               n, err := rdr.Read(buf)
+               ready := make(chan bool)
+               var n int
+               var err error
+               go func() {
+                       n, err = rdr.Read(buf)
+                       close(ready)
+               }()
+               select {
+               case <-ready:
+               case <-ctx.Done():
+                       return ctx.Err()
+               }
                if n > len(cmp) || bytes.Compare(cmp[:n], buf[:n]) != 0 {
                        return collisionOrCorrupt(hash, expect[:len(expect)-len(cmp)], buf[:n], rdr)
                }
diff --git a/services/keepstore/config.go b/services/keepstore/config.go
new file mode 100644 (file)
index 0000000..dc06ef5
--- /dev/null
@@ -0,0 +1,188 @@
+package main
+
+import (
+       "bytes"
+       "encoding/json"
+       "fmt"
+       "io/ioutil"
+       "log"
+       "strings"
+       "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
+)
+
+type Config struct {
+       Debug  bool
+       Listen string
+
+       PIDFile string
+
+       MaxBuffers  int
+       MaxRequests int
+
+       BlobSignatureTTL    arvados.Duration
+       BlobSigningKeyFile  string
+       RequireSignatures   bool
+       SystemAuthTokenFile string
+       EnableDelete        bool
+       TrashLifetime       arvados.Duration
+       TrashCheckInterval  arvados.Duration
+
+       Volumes VolumeList
+
+       blobSigningKey  []byte
+       systemAuthToken string
+       debugLogf       func(string, ...interface{})
+}
+
+var theConfig = DefaultConfig()
+
+// DefaultConfig returns the default configuration.
+func DefaultConfig() *Config {
+       return &Config{
+               Listen:             ":25107",
+               MaxBuffers:         128,
+               RequireSignatures:  true,
+               BlobSignatureTTL:   arvados.Duration(14 * 24 * time.Hour),
+               TrashLifetime:      arvados.Duration(14 * 24 * time.Hour),
+               TrashCheckInterval: arvados.Duration(24 * time.Hour),
+               Volumes:            []Volume{},
+       }
+}
+
+// Start should be called exactly once: after setting all public
+// fields, and before using the config.
+func (cfg *Config) Start() error {
+       if cfg.Debug {
+               cfg.debugLogf = log.Printf
+               cfg.debugLogf("debugging enabled")
+       } else {
+               cfg.debugLogf = func(string, ...interface{}) {}
+       }
+
+       if cfg.MaxBuffers < 0 {
+               return fmt.Errorf("MaxBuffers must be greater than zero")
+       }
+       bufs = newBufferPool(cfg.MaxBuffers, BlockSize)
+
+       if cfg.MaxRequests < 1 {
+               cfg.MaxRequests = cfg.MaxBuffers * 2
+               log.Printf("MaxRequests <1 or not specified; defaulting to MaxBuffers * 2 == %d", cfg.MaxRequests)
+       }
+
+       if cfg.BlobSigningKeyFile != "" {
+               buf, err := ioutil.ReadFile(cfg.BlobSigningKeyFile)
+               if err != nil {
+                       return fmt.Errorf("reading blob signing key file: %s", err)
+               }
+               cfg.blobSigningKey = bytes.TrimSpace(buf)
+               if len(cfg.blobSigningKey) == 0 {
+                       return fmt.Errorf("blob signing key file %q is empty", cfg.BlobSigningKeyFile)
+               }
+       } else if cfg.RequireSignatures {
+               return fmt.Errorf("cannot enable RequireSignatures (-enforce-permissions) without a blob signing key")
+       } else {
+               log.Println("Running without a blob signing key. Block locators " +
+                       "returned by this server will not be signed, and will be rejected " +
+                       "by a server that enforces permissions.")
+               log.Println("To fix this, use the BlobSigningKeyFile config entry.")
+       }
+
+       if fn := cfg.SystemAuthTokenFile; fn != "" {
+               buf, err := ioutil.ReadFile(fn)
+               if err != nil {
+                       return fmt.Errorf("cannot read system auth token file %q: %s", fn, err)
+               }
+               cfg.systemAuthToken = strings.TrimSpace(string(buf))
+       }
+
+       if cfg.EnableDelete {
+               log.Print("Trash/delete features are enabled. WARNING: this has not " +
+                       "been extensively tested. You should disable this unless you can afford to lose data.")
+       }
+
+       if len(cfg.Volumes) == 0 {
+               if (&unixVolumeAdder{cfg}).Discover() == 0 {
+                       return fmt.Errorf("no volumes found")
+               }
+       }
+       for _, v := range cfg.Volumes {
+               if err := v.Start(); err != nil {
+                       return fmt.Errorf("volume %s: %s", v, err)
+               }
+               log.Printf("Using volume %v (writable=%v)", v, v.Writable())
+       }
+       return nil
+}
+
+// VolumeTypes is built up by init() funcs in the source files that
+// define the volume types.
+var VolumeTypes = []func() VolumeWithExamples{}
+
+type VolumeList []Volume
+
+// UnmarshalJSON, given an array of objects, deserializes each object
+// as the volume type indicated by the object's Type field.
+func (vols *VolumeList) UnmarshalJSON(data []byte) error {
+       typeMap := map[string]func() VolumeWithExamples{}
+       for _, factory := range VolumeTypes {
+               t := factory().Type()
+               if _, ok := typeMap[t]; ok {
+                       log.Fatal("volume type %+q is claimed by multiple VolumeTypes")
+               }
+               typeMap[t] = factory
+       }
+
+       var mapList []map[string]interface{}
+       err := json.Unmarshal(data, &mapList)
+       if err != nil {
+               return err
+       }
+       for _, mapIn := range mapList {
+               typeIn, ok := mapIn["Type"].(string)
+               if !ok {
+                       return fmt.Errorf("invalid volume type %+v", mapIn["Type"])
+               }
+               factory, ok := typeMap[typeIn]
+               if !ok {
+                       return fmt.Errorf("unsupported volume type %+q", typeIn)
+               }
+               data, err := json.Marshal(mapIn)
+               if err != nil {
+                       return err
+               }
+               vol := factory()
+               err = json.Unmarshal(data, vol)
+               if err != nil {
+                       return err
+               }
+               *vols = append(*vols, vol)
+       }
+       return nil
+}
+
+// MarshalJSON adds a "Type" field to each volume corresponding to its
+// Type().
+func (vl *VolumeList) MarshalJSON() ([]byte, error) {
+       data := []byte{'['}
+       for _, vs := range *vl {
+               j, err := json.Marshal(vs)
+               if err != nil {
+                       return nil, err
+               }
+               if len(data) > 1 {
+                       data = append(data, byte(','))
+               }
+               t, err := json.Marshal(vs.Type())
+               if err != nil {
+                       panic(err)
+               }
+               data = append(data, j[0])
+               data = append(data, []byte(`"Type":`)...)
+               data = append(data, t...)
+               data = append(data, byte(','))
+               data = append(data, j[1:]...)
+       }
+       return append(data, byte(']')), nil
+}
diff --git a/services/keepstore/config_test.go b/services/keepstore/config_test.go
new file mode 100644 (file)
index 0000000..eaa0904
--- /dev/null
@@ -0,0 +1,9 @@
+package main
+
+import (
+       "log"
+)
+
+func init() {
+       theConfig.debugLogf = log.Printf
+}
diff --git a/services/keepstore/count.go b/services/keepstore/count.go
new file mode 100644 (file)
index 0000000..a9f7436
--- /dev/null
@@ -0,0 +1,44 @@
+package main
+
+import (
+       "io"
+)
+
+func NewCountingWriter(w io.Writer, f func(uint64)) io.WriteCloser {
+       return &countingReadWriter{
+               writer:  w,
+               counter: f,
+       }
+}
+
+func NewCountingReader(r io.Reader, f func(uint64)) io.ReadCloser {
+       return &countingReadWriter{
+               reader:  r,
+               counter: f,
+       }
+}
+
+type countingReadWriter struct {
+       reader  io.Reader
+       writer  io.Writer
+       counter func(uint64)
+}
+
+func (crw *countingReadWriter) Read(buf []byte) (int, error) {
+       n, err := crw.reader.Read(buf)
+       crw.counter(uint64(n))
+       return n, err
+}
+
+func (crw *countingReadWriter) Write(buf []byte) (int, error) {
+       n, err := crw.writer.Write(buf)
+       crw.counter(uint64(n))
+       return n, err
+}
+
+func (crw *countingReadWriter) Close() error {
+       if c, ok := crw.writer.(io.Closer); ok {
+               return c.Close()
+       }
+       return nil
+}
diff --git a/services/keepstore/deprecated.go b/services/keepstore/deprecated.go
new file mode 100644 (file)
index 0000000..7caa6b5
--- /dev/null
@@ -0,0 +1,43 @@
+package main
+
+import (
+       "flag"
+       "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
+)
+
+type deprecatedOptions struct {
+       flagSerializeIO     bool
+       flagReadonly        bool
+       neverDelete         bool
+       signatureTTLSeconds int
+}
+
+var deprecated = deprecatedOptions{
+       neverDelete:         !theConfig.EnableDelete,
+       signatureTTLSeconds: int(theConfig.BlobSignatureTTL.Duration() / time.Second),
+}
+
+func (depr *deprecatedOptions) beforeFlagParse(cfg *Config) {
+       flag.StringVar(&cfg.Listen, "listen", cfg.Listen, "see Listen configuration")
+       flag.IntVar(&cfg.MaxBuffers, "max-buffers", cfg.MaxBuffers, "see MaxBuffers configuration")
+       flag.IntVar(&cfg.MaxRequests, "max-requests", cfg.MaxRequests, "see MaxRequests configuration")
+       flag.BoolVar(&depr.neverDelete, "never-delete", depr.neverDelete, "see EnableDelete configuration")
+       flag.BoolVar(&cfg.RequireSignatures, "enforce-permissions", cfg.RequireSignatures, "see RequireSignatures configuration")
+       flag.StringVar(&cfg.BlobSigningKeyFile, "permission-key-file", cfg.BlobSigningKeyFile, "see BlobSigningKey`File` configuration")
+       flag.StringVar(&cfg.BlobSigningKeyFile, "blob-signing-key-file", cfg.BlobSigningKeyFile, "see BlobSigningKey`File` configuration")
+       flag.StringVar(&cfg.SystemAuthTokenFile, "data-manager-token-file", cfg.SystemAuthTokenFile, "see SystemAuthToken`File` configuration")
+       flag.IntVar(&depr.signatureTTLSeconds, "permission-ttl", depr.signatureTTLSeconds, "signature TTL in seconds; see BlobSignatureTTL configuration")
+       flag.IntVar(&depr.signatureTTLSeconds, "blob-signature-ttl", depr.signatureTTLSeconds, "signature TTL in seconds; see BlobSignatureTTL configuration")
+       flag.Var(&cfg.TrashLifetime, "trash-lifetime", "see TrashLifetime configuration")
+       flag.BoolVar(&depr.flagSerializeIO, "serialize", depr.flagSerializeIO, "serialize read and write operations on the following volumes.")
+       flag.BoolVar(&depr.flagReadonly, "readonly", depr.flagReadonly, "do not write, delete, or touch anything on the following volumes.")
+       flag.StringVar(&cfg.PIDFile, "pid", cfg.PIDFile, "see `PIDFile` configuration")
+       flag.Var(&cfg.TrashCheckInterval, "trash-check-interval", "see TrashCheckInterval configuration")
+}
+
+func (depr *deprecatedOptions) afterFlagParse(cfg *Config) {
+       cfg.BlobSignatureTTL = arvados.Duration(depr.signatureTTLSeconds) * arvados.Duration(time.Second)
+       cfg.EnableDelete = !depr.neverDelete
+}
index 7c17424ba568227790469e4e32867f33fea8ff4e..9708b4e6be32f96645d500dfcd4319972f213d47 100644 (file)
@@ -11,6 +11,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "encoding/json"
        "fmt"
        "net/http"
@@ -20,6 +21,8 @@ import (
        "strings"
        "testing"
        "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
 )
 
 // A RequestTester represents the parameters for an HTTP request to
@@ -46,19 +49,19 @@ func TestGetHandler(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllWritable()
-       if err := vols[0].Put(TestHash, TestBlock); err != nil {
+       if err := vols[0].Put(context.Background(), TestHash, TestBlock); err != nil {
                t.Error(err)
        }
 
        // Create locators for testing.
        // Turn on permission settings so we can generate signed locators.
-       enforcePermissions = true
-       PermissionSecret = []byte(knownKey)
-       blobSignatureTTL = 300 * time.Second
+       theConfig.RequireSignatures = true
+       theConfig.blobSigningKey = []byte(knownKey)
+       theConfig.BlobSignatureTTL.Set("5m")
 
        var (
                unsignedLocator  = "/" + TestHash
-               validTimestamp   = time.Now().Add(blobSignatureTTL)
+               validTimestamp   = time.Now().Add(theConfig.BlobSignatureTTL.Duration())
                expiredTimestamp = time.Now().Add(-time.Hour)
                signedLocator    = "/" + SignLocator(TestHash, knownToken, validTimestamp)
                expiredLocator   = "/" + SignLocator(TestHash, knownToken, expiredTimestamp)
@@ -66,7 +69,7 @@ func TestGetHandler(t *testing.T) {
 
        // -----------------
        // Test unauthenticated request with permissions off.
-       enforcePermissions = false
+       theConfig.RequireSignatures = false
 
        // Unauthenticated request, unsigned locator
        // => OK
@@ -90,7 +93,7 @@ func TestGetHandler(t *testing.T) {
 
        // ----------------
        // Permissions: on.
-       enforcePermissions = true
+       theConfig.RequireSignatures = true
 
        // Authenticated request, signed locator
        // => OK
@@ -175,8 +178,8 @@ func TestPutHandler(t *testing.T) {
        // ------------------
        // With a server key.
 
-       PermissionSecret = []byte(knownKey)
-       blobSignatureTTL = 300 * time.Second
+       theConfig.blobSigningKey = []byte(knownKey)
+       theConfig.BlobSignatureTTL.Set("5m")
 
        // When a permission key is available, the locator returned
        // from an authenticated PUT request will be signed.
@@ -220,7 +223,7 @@ func TestPutHandler(t *testing.T) {
 
 func TestPutAndDeleteSkipReadonlyVolumes(t *testing.T) {
        defer teardown()
-       dataManagerToken = "fake-data-manager-token"
+       theConfig.systemAuthToken = "fake-data-manager-token"
        vols := []*MockVolume{CreateMockVolume(), CreateMockVolume()}
        vols[0].Readonly = true
        KeepVM = MakeRRVolumeManager([]Volume{vols[0], vols[1]})
@@ -232,15 +235,15 @@ func TestPutAndDeleteSkipReadonlyVolumes(t *testing.T) {
                        requestBody: TestBlock,
                })
        defer func(orig bool) {
-               neverDelete = orig
-       }(neverDelete)
-       neverDelete = false
+               theConfig.EnableDelete = orig
+       }(theConfig.EnableDelete)
+       theConfig.EnableDelete = true
        IssueRequest(
                &RequestTester{
                        method:      "DELETE",
                        uri:         "/" + TestHash,
                        requestBody: TestBlock,
-                       apiToken:    dataManagerToken,
+                       apiToken:    theConfig.systemAuthToken,
                })
        type expect struct {
                volnum    int
@@ -274,7 +277,7 @@ func TestPutAndDeleteSkipReadonlyVolumes(t *testing.T) {
 //   - authenticated   /index/prefix request | superuser
 //
 // The only /index requests that should succeed are those issued by the
-// superuser. They should pass regardless of the value of enforcePermissions.
+// superuser. They should pass regardless of the value of RequireSignatures.
 //
 func TestIndexHandler(t *testing.T) {
        defer teardown()
@@ -286,12 +289,12 @@ func TestIndexHandler(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllWritable()
-       vols[0].Put(TestHash, TestBlock)
-       vols[1].Put(TestHash2, TestBlock2)
-       vols[0].Put(TestHash+".meta", []byte("metadata"))
-       vols[1].Put(TestHash2+".meta", []byte("metadata"))
+       vols[0].Put(context.Background(), TestHash, TestBlock)
+       vols[1].Put(context.Background(), TestHash2, TestBlock2)
+       vols[0].Put(context.Background(), TestHash+".meta", []byte("metadata"))
+       vols[1].Put(context.Background(), TestHash2+".meta", []byte("metadata"))
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
        unauthenticatedReq := &RequestTester{
                method: "GET",
@@ -305,7 +308,7 @@ func TestIndexHandler(t *testing.T) {
        superuserReq := &RequestTester{
                method:   "GET",
                uri:      "/index",
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        unauthPrefixReq := &RequestTester{
                method: "GET",
@@ -319,32 +322,32 @@ func TestIndexHandler(t *testing.T) {
        superuserPrefixReq := &RequestTester{
                method:   "GET",
                uri:      "/index/" + TestHash[0:3],
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        superuserNoSuchPrefixReq := &RequestTester{
                method:   "GET",
                uri:      "/index/abcd",
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        superuserInvalidPrefixReq := &RequestTester{
                method:   "GET",
                uri:      "/index/xyz",
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
 
        // -------------------------------------------------------------
        // Only the superuser should be allowed to issue /index requests.
 
        // ---------------------------
-       // enforcePermissions enabled
+       // RequireSignatures enabled
        // This setting should not affect tests passing.
-       enforcePermissions = true
+       theConfig.RequireSignatures = true
 
        // unauthenticated /index request
        // => UnauthorizedError
        response := IssueRequest(unauthenticatedReq)
        ExpectStatusCode(t,
-               "enforcePermissions on, unauthenticated request",
+               "RequireSignatures on, unauthenticated request",
                UnauthorizedError.HTTPCode,
                response)
 
@@ -381,9 +384,9 @@ func TestIndexHandler(t *testing.T) {
                response)
 
        // ----------------------------
-       // enforcePermissions disabled
+       // RequireSignatures disabled
        // Valid Request should still pass.
-       enforcePermissions = false
+       theConfig.RequireSignatures = false
 
        // superuser /index request
        // => OK
@@ -475,17 +478,17 @@ func TestDeleteHandler(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllWritable()
-       vols[0].Put(TestHash, TestBlock)
+       vols[0].Put(context.Background(), TestHash, TestBlock)
 
-       // Explicitly set the blobSignatureTTL to 0 for these
+       // Explicitly set the BlobSignatureTTL to 0 for these
        // tests, to ensure the MockVolume deletes the blocks
        // even though they have just been created.
-       blobSignatureTTL = time.Duration(0)
+       theConfig.BlobSignatureTTL = arvados.Duration(0)
 
        var userToken = "NOT DATA MANAGER TOKEN"
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
-       neverDelete = false
+       theConfig.EnableDelete = true
 
        unauthReq := &RequestTester{
                method: "DELETE",
@@ -501,13 +504,13 @@ func TestDeleteHandler(t *testing.T) {
        superuserExistingBlockReq := &RequestTester{
                method:   "DELETE",
                uri:      "/" + TestHash,
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
 
        superuserNonexistentBlockReq := &RequestTester{
                method:   "DELETE",
                uri:      "/" + TestHash2,
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
 
        // Unauthenticated request returns PermissionError.
@@ -538,14 +541,14 @@ func TestDeleteHandler(t *testing.T) {
                http.StatusNotFound,
                response)
 
-       // Authenticated admin request for existing block while neverDelete is set.
-       neverDelete = true
+       // Authenticated admin request for existing block while EnableDelete is false.
+       theConfig.EnableDelete = false
        response = IssueRequest(superuserExistingBlockReq)
        ExpectStatusCode(t,
                "authenticated request, existing block, method disabled",
                MethodDisabledError.HTTPCode,
                response)
-       neverDelete = false
+       theConfig.EnableDelete = true
 
        // Authenticated admin request for existing block.
        response = IssueRequest(superuserExistingBlockReq)
@@ -562,16 +565,16 @@ func TestDeleteHandler(t *testing.T) {
        }
        // Confirm the block has been deleted
        buf := make([]byte, BlockSize)
-       _, err := vols[0].Get(TestHash, buf)
+       _, err := vols[0].Get(context.Background(), TestHash, buf)
        var blockDeleted = os.IsNotExist(err)
        if !blockDeleted {
                t.Error("superuserExistingBlockReq: block not deleted")
        }
 
-       // A DELETE request on a block newer than blobSignatureTTL
+       // A DELETE request on a block newer than BlobSignatureTTL
        // should return success but leave the block on the volume.
-       vols[0].Put(TestHash, TestBlock)
-       blobSignatureTTL = time.Hour
+       vols[0].Put(context.Background(), TestHash, TestBlock)
+       theConfig.BlobSignatureTTL = arvados.Duration(time.Hour)
 
        response = IssueRequest(superuserExistingBlockReq)
        ExpectStatusCode(t,
@@ -586,7 +589,7 @@ func TestDeleteHandler(t *testing.T) {
                        expectedDc, responseDc)
        }
        // Confirm the block has NOT been deleted.
-       _, err = vols[0].Get(TestHash, buf)
+       _, err = vols[0].Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Errorf("testing delete on new block: %s\n", err)
        }
@@ -623,7 +626,7 @@ func TestPullHandler(t *testing.T) {
        defer teardown()
 
        var userToken = "USER TOKEN"
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
        pullq = NewWorkQueue()
 
@@ -668,13 +671,13 @@ func TestPullHandler(t *testing.T) {
                },
                {
                        "Valid pull request from the data manager",
-                       RequestTester{"/pull", dataManagerToken, "PUT", goodJSON},
+                       RequestTester{"/pull", theConfig.systemAuthToken, "PUT", goodJSON},
                        http.StatusOK,
                        "Received 3 pull requests\n",
                },
                {
                        "Invalid pull request from the data manager",
-                       RequestTester{"/pull", dataManagerToken, "PUT", badJSON},
+                       RequestTester{"/pull", theConfig.systemAuthToken, "PUT", badJSON},
                        http.StatusBadRequest,
                        "",
                },
@@ -729,7 +732,7 @@ func TestTrashHandler(t *testing.T) {
        defer teardown()
 
        var userToken = "USER TOKEN"
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
        trashq = NewWorkQueue()
 
@@ -772,13 +775,13 @@ func TestTrashHandler(t *testing.T) {
                },
                {
                        "Valid trash list from the data manager",
-                       RequestTester{"/trash", dataManagerToken, "PUT", goodJSON},
+                       RequestTester{"/trash", theConfig.systemAuthToken, "PUT", goodJSON},
                        http.StatusOK,
                        "Received 3 trash requests\n",
                },
                {
                        "Invalid trash list from the data manager",
-                       RequestTester{"/trash", dataManagerToken, "PUT", badJSON},
+                       RequestTester{"/trash", theConfig.systemAuthToken, "PUT", badJSON},
                        http.StatusBadRequest,
                        "",
                },
@@ -873,7 +876,7 @@ func TestPutNeedsOnlyOneBuffer(t *testing.T) {
        select {
        case <-ok:
        case <-time.After(time.Second):
-               t.Fatal("PUT deadlocks with maxBuffers==1")
+               t.Fatal("PUT deadlocks with MaxBuffers==1")
        }
 }
 
@@ -888,7 +891,7 @@ func TestPutHandlerNoBufferleak(t *testing.T) {
 
        ok := make(chan bool)
        go func() {
-               for i := 0; i < maxBuffers+1; i++ {
+               for i := 0; i < theConfig.MaxBuffers+1; i++ {
                        // Unauthenticated request, no server key
                        // => OK (unsigned response)
                        unsignedLocator := "/" + TestHash
@@ -925,9 +928,9 @@ func (r *notifyingResponseRecorder) CloseNotify() <-chan bool {
 
 func TestGetHandlerClientDisconnect(t *testing.T) {
        defer func(was bool) {
-               enforcePermissions = was
-       }(enforcePermissions)
-       enforcePermissions = false
+               theConfig.RequireSignatures = was
+       }(theConfig.RequireSignatures)
+       theConfig.RequireSignatures = false
 
        defer func(orig *bufferPool) {
                bufs = orig
@@ -938,7 +941,7 @@ func TestGetHandlerClientDisconnect(t *testing.T) {
        KeepVM = MakeTestVolumeManager(2)
        defer KeepVM.Close()
 
-       if err := KeepVM.AllWritable()[0].Put(TestHash, TestBlock); err != nil {
+       if err := KeepVM.AllWritable()[0].Put(context.Background(), TestHash, TestBlock); err != nil {
                t.Error(err)
        }
 
@@ -975,7 +978,7 @@ func TestGetHandlerClientDisconnect(t *testing.T) {
 
 // Invoke the GetBlockHandler a bunch of times to test for bufferpool resource
 // leak.
-func TestGetHandlerNoBufferleak(t *testing.T) {
+func TestGetHandlerNoBufferLeak(t *testing.T) {
        defer teardown()
 
        // Prepare two test Keep volumes. Our block is stored on the second volume.
@@ -983,13 +986,13 @@ func TestGetHandlerNoBufferleak(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllWritable()
-       if err := vols[0].Put(TestHash, TestBlock); err != nil {
+       if err := vols[0].Put(context.Background(), TestHash, TestBlock); err != nil {
                t.Error(err)
        }
 
        ok := make(chan bool)
        go func() {
-               for i := 0; i < maxBuffers+1; i++ {
+               for i := 0; i < theConfig.MaxBuffers+1; i++ {
                        // Unauthenticated request, unsigned locator
                        // => OK
                        unsignedLocator := "/" + TestHash
@@ -1038,9 +1041,9 @@ func TestUntrashHandler(t *testing.T) {
        KeepVM = MakeTestVolumeManager(2)
        defer KeepVM.Close()
        vols := KeepVM.AllWritable()
-       vols[0].Put(TestHash, TestBlock)
+       vols[0].Put(context.Background(), TestHash, TestBlock)
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
        // unauthenticatedReq => UnauthorizedError
        unauthenticatedReq := &RequestTester{
@@ -1070,7 +1073,7 @@ func TestUntrashHandler(t *testing.T) {
        datamanagerWithBadHashReq := &RequestTester{
                method:   "PUT",
                uri:      "/untrash/thisisnotalocator",
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        response = IssueRequest(datamanagerWithBadHashReq)
        ExpectStatusCode(t,
@@ -1082,7 +1085,7 @@ func TestUntrashHandler(t *testing.T) {
        datamanagerWrongMethodReq := &RequestTester{
                method:   "GET",
                uri:      "/untrash/" + TestHash,
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        response = IssueRequest(datamanagerWrongMethodReq)
        ExpectStatusCode(t,
@@ -1094,7 +1097,7 @@ func TestUntrashHandler(t *testing.T) {
        datamanagerReq := &RequestTester{
                method:   "PUT",
                uri:      "/untrash/" + TestHash,
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        response = IssueRequest(datamanagerReq)
        ExpectStatusCode(t,
@@ -1119,13 +1122,13 @@ func TestUntrashHandlerWithNoWritableVolumes(t *testing.T) {
        KeepVM = MakeRRVolumeManager([]Volume{vols[0], vols[1]})
        defer KeepVM.Close()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
        // datamanagerReq => StatusOK
        datamanagerReq := &RequestTester{
                method:   "PUT",
                uri:      "/untrash/" + TestHash,
-               apiToken: dataManagerToken,
+               apiToken: theConfig.systemAuthToken,
        }
        response := IssueRequest(datamanagerReq)
        ExpectStatusCode(t,
index a6798a9f72bb6355ba8b5f6d9cb7d58f3ffe69e9..b51009ea4d78348fe53bab01c13070d950e6aa42 100644 (file)
@@ -9,6 +9,7 @@ package main
 
 import (
        "container/list"
+       "context"
        "crypto/md5"
        "encoding/json"
        "fmt"
@@ -45,6 +46,9 @@ func MakeRESTRouter() *mux.Router {
        // Privileged client only.
        rest.HandleFunc(`/index/{prefix:[0-9a-f]{0,32}}`, IndexHandler).Methods("GET", "HEAD")
 
+       // Internals/debugging info (runtime.MemStats)
+       rest.HandleFunc(`/debug.json`, DebugHandler).Methods("GET", "HEAD")
+
        // List volumes: path, device number, bytes used/avail.
        rest.HandleFunc(`/status.json`, StatusHandler).Methods("GET", "HEAD")
 
@@ -71,7 +75,10 @@ func BadRequestHandler(w http.ResponseWriter, r *http.Request) {
 
 // GetBlockHandler is a HandleFunc to address Get block requests.
 func GetBlockHandler(resp http.ResponseWriter, req *http.Request) {
-       if enforcePermissions {
+       ctx, cancel := contextForResponse(context.TODO(), resp)
+       defer cancel()
+
+       if theConfig.RequireSignatures {
                locator := req.URL.Path[1:] // strip leading slash
                if err := VerifySignature(locator, GetAPIToken(req)); err != nil {
                        http.Error(resp, err.Error(), err.(*KeepError).HTTPCode)
@@ -86,14 +93,14 @@ func GetBlockHandler(resp http.ResponseWriter, req *http.Request) {
        // isn't here, we can return 404 now instead of waiting for a
        // buffer.
 
-       buf, err := getBufferForResponseWriter(resp, bufs, BlockSize)
+       buf, err := getBufferWithContext(ctx, bufs, BlockSize)
        if err != nil {
                http.Error(resp, err.Error(), http.StatusServiceUnavailable)
                return
        }
        defer bufs.Put(buf)
 
-       size, err := GetBlock(mux.Vars(req)["hash"], buf, resp)
+       size, err := GetBlock(ctx, mux.Vars(req)["hash"], buf, resp)
        if err != nil {
                code := http.StatusInternalServerError
                if err, ok := err.(*KeepError); ok {
@@ -108,24 +115,33 @@ func GetBlockHandler(resp http.ResponseWriter, req *http.Request) {
        resp.Write(buf[:size])
 }
 
+// Return a new context that gets cancelled by resp's CloseNotifier.
+func contextForResponse(parent context.Context, resp http.ResponseWriter) (context.Context, context.CancelFunc) {
+       ctx, cancel := context.WithCancel(parent)
+       if cn, ok := resp.(http.CloseNotifier); ok {
+               go func(c <-chan bool) {
+                       select {
+                       case <-c:
+                               theConfig.debugLogf("cancel context")
+                               cancel()
+                       case <-ctx.Done():
+                       }
+               }(cn.CloseNotify())
+       }
+       return ctx, cancel
+}
+
 // Get a buffer from the pool -- but give up and return a non-nil
-// error if resp implements http.CloseNotifier and tells us that the
-// client has disconnected before we get a buffer.
-func getBufferForResponseWriter(resp http.ResponseWriter, bufs *bufferPool, bufSize int) ([]byte, error) {
-       var closeNotifier <-chan bool
-       if resp, ok := resp.(http.CloseNotifier); ok {
-               closeNotifier = resp.CloseNotify()
-       }
-       var buf []byte
+// error if ctx ends before we get a buffer.
+func getBufferWithContext(ctx context.Context, bufs *bufferPool, bufSize int) ([]byte, error) {
        bufReady := make(chan []byte)
        go func() {
                bufReady <- bufs.Get(bufSize)
-               close(bufReady)
        }()
        select {
-       case buf = <-bufReady:
+       case buf := <-bufReady:
                return buf, nil
-       case <-closeNotifier:
+       case <-ctx.Done():
                go func() {
                        // Even if closeNotifier happened first, we
                        // need to keep waiting for our buf so we can
@@ -138,6 +154,9 @@ func getBufferForResponseWriter(resp http.ResponseWriter, bufs *bufferPool, bufS
 
 // PutBlockHandler is a HandleFunc to address Put block requests.
 func PutBlockHandler(resp http.ResponseWriter, req *http.Request) {
+       ctx, cancel := contextForResponse(context.TODO(), resp)
+       defer cancel()
+
        hash := mux.Vars(req)["hash"]
 
        // Detect as many error conditions as possible before reading
@@ -159,7 +178,7 @@ func PutBlockHandler(resp http.ResponseWriter, req *http.Request) {
                return
        }
 
-       buf, err := getBufferForResponseWriter(resp, bufs, int(req.ContentLength))
+       buf, err := getBufferWithContext(ctx, bufs, int(req.ContentLength))
        if err != nil {
                http.Error(resp, err.Error(), http.StatusServiceUnavailable)
                return
@@ -172,12 +191,15 @@ func PutBlockHandler(resp http.ResponseWriter, req *http.Request) {
                return
        }
 
-       replication, err := PutBlock(buf, hash)
+       replication, err := PutBlock(ctx, buf, hash)
        bufs.Put(buf)
 
        if err != nil {
-               ke := err.(*KeepError)
-               http.Error(resp, ke.Error(), ke.HTTPCode)
+               code := http.StatusInternalServerError
+               if err, ok := err.(*KeepError); ok {
+                       code = err.HTTPCode
+               }
+               http.Error(resp, err.Error(), code)
                return
        }
 
@@ -185,8 +207,8 @@ func PutBlockHandler(resp http.ResponseWriter, req *http.Request) {
        // return it to the client.
        returnHash := fmt.Sprintf("%s+%d", hash, req.ContentLength)
        apiToken := GetAPIToken(req)
-       if PermissionSecret != nil && apiToken != "" {
-               expiry := time.Now().Add(blobSignatureTTL)
+       if theConfig.blobSigningKey != nil && apiToken != "" {
+               expiry := time.Now().Add(theConfig.BlobSignatureTTL.Duration())
                returnHash = SignLocator(returnHash, apiToken, expiry)
        }
        resp.Header().Set("X-Keep-Replicas-Stored", strconv.Itoa(replication))
@@ -196,7 +218,7 @@ func PutBlockHandler(resp http.ResponseWriter, req *http.Request) {
 // IndexHandler is a HandleFunc to address /index and /index/{prefix} requests.
 func IndexHandler(resp http.ResponseWriter, req *http.Request) {
        // Reject unauthorized requests.
-       if !IsDataManagerToken(GetAPIToken(req)) {
+       if !IsSystemAuth(GetAPIToken(req)) {
                http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode)
                return
        }
@@ -220,18 +242,6 @@ func IndexHandler(resp http.ResponseWriter, req *http.Request) {
        resp.Write([]byte{'\n'})
 }
 
-// StatusHandler
-//     Responds to /status.json requests with the current node status,
-//     described in a JSON structure.
-//
-//     The data given in a status.json response includes:
-//        volumes - a list of Keep volumes currently in use by this server
-//          each volume is an object with the following fields:
-//            * mount_point
-//            * device_num (an integer identifying the underlying filesystem)
-//            * bytes_free
-//            * bytes_used
-
 // PoolStatus struct
 type PoolStatus struct {
        Alloc uint64 `json:"BytesAllocated"`
@@ -239,18 +249,37 @@ type PoolStatus struct {
        Len   int    `json:"BuffersInUse"`
 }
 
+type volumeStatusEnt struct {
+       Label         string
+       Status        *VolumeStatus `json:",omitempty"`
+       VolumeStats   *ioStats      `json:",omitempty"`
+       InternalStats interface{}   `json:",omitempty"`
+}
+
 // NodeStatus struct
 type NodeStatus struct {
-       Volumes    []*VolumeStatus `json:"volumes"`
+       Volumes    []*volumeStatusEnt
        BufferPool PoolStatus
        PullQueue  WorkQueueStatus
        TrashQueue WorkQueueStatus
-       Memory     runtime.MemStats
 }
 
 var st NodeStatus
 var stLock sync.Mutex
 
+// DebugHandler addresses /debug.json requests.
+func DebugHandler(resp http.ResponseWriter, req *http.Request) {
+       type debugStats struct {
+               MemStats runtime.MemStats
+       }
+       var ds debugStats
+       runtime.ReadMemStats(&ds.MemStats)
+       err := json.NewEncoder(resp).Encode(&ds)
+       if err != nil {
+               http.Error(resp, err.Error(), 500)
+       }
+}
+
 // StatusHandler addresses /status.json requests.
 func StatusHandler(resp http.ResponseWriter, req *http.Request) {
        stLock.Lock()
@@ -270,20 +299,26 @@ func StatusHandler(resp http.ResponseWriter, req *http.Request) {
 func readNodeStatus(st *NodeStatus) {
        vols := KeepVM.AllReadable()
        if cap(st.Volumes) < len(vols) {
-               st.Volumes = make([]*VolumeStatus, len(vols))
+               st.Volumes = make([]*volumeStatusEnt, len(vols))
        }
        st.Volumes = st.Volumes[:0]
        for _, vol := range vols {
-               if s := vol.Status(); s != nil {
-                       st.Volumes = append(st.Volumes, s)
+               var internalStats interface{}
+               if vol, ok := vol.(InternalStatser); ok {
+                       internalStats = vol.InternalStats()
                }
+               st.Volumes = append(st.Volumes, &volumeStatusEnt{
+                       Label:         vol.String(),
+                       Status:        vol.Status(),
+                       InternalStats: internalStats,
+                       //VolumeStats: KeepVM.VolumeStats(vol),
+               })
        }
        st.BufferPool.Alloc = bufs.Alloc()
        st.BufferPool.Cap = bufs.Cap()
        st.BufferPool.Len = bufs.Len()
        st.PullQueue = getWorkQueueStatus(pullq)
        st.TrashQueue = getWorkQueueStatus(trashq)
-       runtime.ReadMemStats(&st.Memory)
 }
 
 // return a WorkQueueStatus for the given queue. If q is nil (which
@@ -334,7 +369,7 @@ func DeleteHandler(resp http.ResponseWriter, req *http.Request) {
                return
        }
 
-       if neverDelete {
+       if !theConfig.EnableDelete {
                http.Error(resp, MethodDisabledError.Error(), MethodDisabledError.HTTPCode)
                return
        }
@@ -419,7 +454,7 @@ type PullRequest struct {
 // PullHandler processes "PUT /pull" requests for the data manager.
 func PullHandler(resp http.ResponseWriter, req *http.Request) {
        // Reject unauthorized requests.
-       if !IsDataManagerToken(GetAPIToken(req)) {
+       if !IsSystemAuth(GetAPIToken(req)) {
                http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode)
                return
        }
@@ -455,7 +490,7 @@ type TrashRequest struct {
 // TrashHandler processes /trash requests.
 func TrashHandler(resp http.ResponseWriter, req *http.Request) {
        // Reject unauthorized requests.
-       if !IsDataManagerToken(GetAPIToken(req)) {
+       if !IsSystemAuth(GetAPIToken(req)) {
                http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode)
                return
        }
@@ -485,7 +520,7 @@ func TrashHandler(resp http.ResponseWriter, req *http.Request) {
 // UntrashHandler processes "PUT /untrash/{hash:[0-9a-f]{32}}" requests for the data manager.
 func UntrashHandler(resp http.ResponseWriter, req *http.Request) {
        // Reject unauthorized requests.
-       if !IsDataManagerToken(GetAPIToken(req)) {
+       if !IsSystemAuth(GetAPIToken(req)) {
                http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode)
                return
        }
@@ -548,12 +583,17 @@ func UntrashHandler(resp http.ResponseWriter, req *http.Request) {
 // If the block found does not have the correct MD5 hash, returns
 // DiskHashError.
 //
-func GetBlock(hash string, buf []byte, resp http.ResponseWriter) (int, error) {
+func GetBlock(ctx context.Context, hash string, buf []byte, resp http.ResponseWriter) (int, error) {
        // Attempt to read the requested hash from a keep volume.
        errorToCaller := NotFoundError
 
        for _, vol := range KeepVM.AllReadable() {
-               size, err := vol.Get(hash, buf)
+               size, err := vol.Get(ctx, hash, buf)
+               select {
+               case <-ctx.Done():
+                       return 0, ErrClientDisconnect
+               default:
+               }
                if err != nil {
                        // IsNotExist is an expected error and may be
                        // ignored. All other errors are logged. In
@@ -587,7 +627,7 @@ func GetBlock(hash string, buf []byte, resp http.ResponseWriter) (int, error) {
 
 // PutBlock Stores the BLOCK (identified by the content id HASH) in Keep.
 //
-// PutBlock(block, hash)
+// PutBlock(ctx, block, hash)
 //   Stores the BLOCK (identified by the content id HASH) in Keep.
 //
 //   The MD5 checksum of the block must be identical to the content id HASH.
@@ -612,7 +652,7 @@ func GetBlock(hash string, buf []byte, resp http.ResponseWriter) (int, error) {
 //          all writes failed). The text of the error message should
 //          provide as much detail as possible.
 //
-func PutBlock(block []byte, hash string) (int, error) {
+func PutBlock(ctx context.Context, block []byte, hash string) (int, error) {
        // Check that BLOCK's checksum matches HASH.
        blockhash := fmt.Sprintf("%x", md5.Sum(block))
        if blockhash != hash {
@@ -623,16 +663,21 @@ func PutBlock(block []byte, hash string) (int, error) {
        // If we already have this data, it's intact on disk, and we
        // can update its timestamp, return success. If we have
        // different data with the same hash, return failure.
-       if n, err := CompareAndTouch(hash, block); err == nil || err == CollisionError {
+       if n, err := CompareAndTouch(ctx, hash, block); err == nil || err == CollisionError {
                return n, err
+       } else if ctx.Err() != nil {
+               return 0, ErrClientDisconnect
        }
 
        // Choose a Keep volume to write to.
        // If this volume fails, try all of the volumes in order.
        if vol := KeepVM.NextWritable(); vol != nil {
-               if err := vol.Put(hash, block); err == nil {
+               if err := vol.Put(ctx, hash, block); err == nil {
                        return vol.Replication(), nil // success!
                }
+               if ctx.Err() != nil {
+                       return 0, ErrClientDisconnect
+               }
        }
 
        writables := KeepVM.AllWritable()
@@ -643,7 +688,10 @@ func PutBlock(block []byte, hash string) (int, error) {
 
        allFull := true
        for _, vol := range writables {
-               err := vol.Put(hash, block)
+               err := vol.Put(ctx, hash, block)
+               if ctx.Err() != nil {
+                       return 0, ErrClientDisconnect
+               }
                if err == nil {
                        return vol.Replication(), nil // success!
                }
@@ -669,10 +717,13 @@ func PutBlock(block []byte, hash string) (int, error) {
 // the relevant block's modification time in order to protect it from
 // premature garbage collection. Otherwise, it returns a non-nil
 // error.
-func CompareAndTouch(hash string, buf []byte) (int, error) {
+func CompareAndTouch(ctx context.Context, hash string, buf []byte) (int, error) {
        var bestErr error = NotFoundError
        for _, vol := range KeepVM.AllWritable() {
-               if err := vol.Compare(hash, buf); err == CollisionError {
+               err := vol.Compare(ctx, hash, buf)
+               if ctx.Err() != nil {
+                       return 0, ctx.Err()
+               } else if err == CollisionError {
                        // Stop if we have a block with same hash but
                        // different content. (It will be impossible
                        // to tell which one is wanted if we have
@@ -746,7 +797,7 @@ func CanDelete(apiToken string) bool {
        }
        // Blocks may be deleted only when Keep has been configured with a
        // data manager.
-       if IsDataManagerToken(apiToken) {
+       if IsSystemAuth(apiToken) {
                return true
        }
        // TODO(twp): look up apiToken with the API server
@@ -755,8 +806,8 @@ func CanDelete(apiToken string) bool {
        return false
 }
 
-// IsDataManagerToken returns true if apiToken represents the data
-// manager's token.
-func IsDataManagerToken(apiToken string) bool {
-       return dataManagerToken != "" && apiToken == dataManagerToken
+// IsSystemAuth returns true if the given token is allowed to perform
+// system level actions like deleting data.
+func IsSystemAuth(token string) bool {
+       return token != "" && token == theConfig.systemAuthToken
 }
index dda7edcec3509e683465a93d5eb775bf18f16d19..181e651d3b4bbef40fa146b8fe06e6b93c206b05 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
 )
 
 // A TestableVolumeManagerFactory creates a volume manager with at least two TestableVolume instances.
@@ -46,7 +47,7 @@ func testGetBlock(t TB, factory TestableVolumeManagerFactory, testHash string, t
 
        // Get should pass
        buf := make([]byte, len(testBlock))
-       n, err := GetBlock(testHash, buf, nil)
+       n, err := GetBlock(context.Background(), testHash, buf, nil)
        if err != nil {
                t.Fatalf("Error while getting block %s", err)
        }
@@ -66,7 +67,7 @@ func testPutRawBadDataGetBlock(t TB, factory TestableVolumeManagerFactory,
 
        // Get should fail
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(testHash, buf, nil)
+       size, err := GetBlock(context.Background(), testHash, buf, nil)
        if err == nil {
                t.Fatalf("Got %+q, expected error while getting corrupt block %v", buf[:size], testHash)
        }
@@ -77,18 +78,18 @@ func testPutBlock(t TB, factory TestableVolumeManagerFactory, testHash string, t
        setupHandlersWithGenericVolumeTest(t, factory)
 
        // PutBlock
-       if _, err := PutBlock(testBlock, testHash); err != nil {
+       if _, err := PutBlock(context.Background(), testBlock, testHash); err != nil {
                t.Fatalf("Error during PutBlock: %s", err)
        }
 
        // Check that PutBlock succeeds again even after CompareAndTouch
-       if _, err := PutBlock(testBlock, testHash); err != nil {
+       if _, err := PutBlock(context.Background(), testBlock, testHash); err != nil {
                t.Fatalf("Error during PutBlock: %s", err)
        }
 
        // Check that PutBlock stored the data as expected
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(testHash, buf, nil)
+       size, err := GetBlock(context.Background(), testHash, buf, nil)
        if err != nil {
                t.Fatalf("Error during GetBlock for %q: %s", testHash, err)
        } else if bytes.Compare(buf[:size], testBlock) != 0 {
@@ -106,14 +107,14 @@ func testPutBlockCorrupt(t TB, factory TestableVolumeManagerFactory,
        testableVolumes[1].PutRaw(testHash, badData)
 
        // Check that PutBlock with good data succeeds
-       if _, err := PutBlock(testBlock, testHash); err != nil {
+       if _, err := PutBlock(context.Background(), testBlock, testHash); err != nil {
                t.Fatalf("Error during PutBlock for %q: %s", testHash, err)
        }
 
        // Put succeeded and overwrote the badData in one volume,
        // and Get should return the testBlock now, ignoring the bad data.
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(testHash, buf, nil)
+       size, err := GetBlock(context.Background(), testHash, buf, nil)
        if err != nil {
                t.Fatalf("Error during GetBlock for %q: %s", testHash, err)
        } else if bytes.Compare(buf[:size], testBlock) != 0 {
index 48b83de4b8aa2a40e62be953e236162d396ddae0..4eaaea8ea3695ac0f9bd69f71bef4fa2fd5b9278 100644 (file)
@@ -1,32 +1,23 @@
 package main
 
 import (
-       "bytes"
        "flag"
        "fmt"
-       "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
-       "git.curoverse.com/arvados.git/sdk/go/httpserver"
-       "git.curoverse.com/arvados.git/sdk/go/keepclient"
-       "io/ioutil"
        "log"
        "net"
        "net/http"
        "os"
        "os/signal"
-       "strings"
        "syscall"
        "time"
-)
 
-// ======================
-// Configuration settings
-//
-// TODO(twp): make all of these configurable via command line flags
-// and/or configuration file settings.
-
-// Default TCP address on which to listen for requests.
-// Initialized by the --listen flag.
-const DefaultAddr = ":25107"
+       "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+       "git.curoverse.com/arvados.git/sdk/go/config"
+       "git.curoverse.com/arvados.git/sdk/go/httpserver"
+       "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       "github.com/coreos/go-systemd/daemon"
+       "github.com/ghodss/yaml"
+)
 
 // A Keep "block" is 64MB.
 const BlockSize = 64 * 1024 * 1024
@@ -38,36 +29,6 @@ const MinFreeKilobytes = BlockSize / 1024
 // ProcMounts /proc/mounts
 var ProcMounts = "/proc/mounts"
 
-// enforcePermissions controls whether permission signatures
-// should be enforced (affecting GET and DELETE requests).
-// Initialized by the -enforce-permissions flag.
-var enforcePermissions bool
-
-// blobSignatureTTL is the time duration for which new permission
-// signatures (returned by PUT requests) will be valid.
-// Initialized by the -permission-ttl flag.
-var blobSignatureTTL time.Duration
-
-// dataManagerToken represents the API token used by the
-// Data Manager, and is required on certain privileged operations.
-// Initialized by the -data-manager-token-file flag.
-var dataManagerToken string
-
-// neverDelete can be used to prevent the DELETE handler from
-// actually deleting anything.
-var neverDelete = true
-
-// trashLifetime is the time duration after a block is trashed
-// during which it can be recovered using an /untrash request
-// Use 10s or 10m or 10h to set as 10 seconds or minutes or hours respectively.
-var trashLifetime time.Duration
-
-// trashCheckInterval is the time duration at which the emptyTrash goroutine
-// will check and delete expired trashed blocks. Default is one day.
-// Use 10s or 10m or 10h to set as 10 seconds or minutes or hours respectively.
-var trashCheckInterval time.Duration
-
-var maxBuffers = 128
 var bufs *bufferPool
 
 // KeepError types.
@@ -121,132 +82,53 @@ var KeepVM VolumeManager
 var pullq *WorkQueue
 var trashq *WorkQueue
 
-type volumeSet []Volume
-
-var (
-       flagSerializeIO bool
-       flagReadonly    bool
-       volumes         volumeSet
-)
+func main() {
+       deprecated.beforeFlagParse(theConfig)
 
-func (vs *volumeSet) String() string {
-       return fmt.Sprintf("%+v", (*vs)[:])
-}
+       dumpConfig := flag.Bool("dump-config", false, "write current configuration to stdout and exit (useful for migrating from command line flags to config file)")
 
-// TODO(twp): continue moving as much code as possible out of main
-// so it can be effectively tested. Esp. handling and postprocessing
-// of command line flags (identifying Keep volumes and initializing
-// permission arguments).
+       defaultConfigPath := "/etc/arvados/keepstore/keepstore.yml"
+       var configPath string
+       flag.StringVar(
+               &configPath,
+               "config",
+               defaultConfigPath,
+               "YAML or JSON configuration file `path`")
+       flag.Usage = usage
+       flag.Parse()
 
-func main() {
-       log.Println("keepstore starting, pid", os.Getpid())
-       defer log.Println("keepstore exiting, pid", os.Getpid())
+       deprecated.afterFlagParse(theConfig)
 
-       var (
-               dataManagerTokenFile string
-               listen               string
-               blobSigningKeyFile   string
-               permissionTTLSec     int
-               pidfile              string
-               maxRequests          int
-       )
-       flag.StringVar(
-               &dataManagerTokenFile,
-               "data-manager-token-file",
-               "",
-               "File with the API token used by the Data Manager. All DELETE "+
-                       "requests or GET /index requests must carry this token.")
-       flag.BoolVar(
-               &enforcePermissions,
-               "enforce-permissions",
-               false,
-               "Enforce permission signatures on requests.")
-       flag.StringVar(
-               &listen,
-               "listen",
-               DefaultAddr,
-               "Listening address, in the form \"host:port\". e.g., 10.0.1.24:8000. Omit the host part to listen on all interfaces.")
-       flag.IntVar(
-               &maxRequests,
-               "max-requests",
-               0,
-               "Maximum concurrent requests. When this limit is reached, new requests will receive 503 responses. Note: this limit does not include idle connections from clients using HTTP keepalive, so it does not strictly limit the number of concurrent connections. (default 2 * max-buffers)")
-       flag.BoolVar(
-               &neverDelete,
-               "never-delete",
-               true,
-               "If true, nothing will be deleted. "+
-                       "Warning: the relevant features in keepstore and data manager have not been extensively tested. "+
-                       "You should leave this option alone unless you can afford to lose data.")
-       flag.StringVar(
-               &blobSigningKeyFile,
-               "permission-key-file",
-               "",
-               "Synonym for -blob-signing-key-file.")
-       flag.StringVar(
-               &blobSigningKeyFile,
-               "blob-signing-key-file",
-               "",
-               "File containing the secret key for generating and verifying "+
-                       "blob permission signatures.")
-       flag.IntVar(
-               &permissionTTLSec,
-               "permission-ttl",
-               0,
-               "Synonym for -blob-signature-ttl.")
-       flag.IntVar(
-               &permissionTTLSec,
-               "blob-signature-ttl",
-               2*7*24*3600,
-               "Lifetime of blob permission signatures in seconds. Modifying the ttl will invalidate all existing signatures. "+
-                       "See services/api/config/application.default.yml.")
-       flag.BoolVar(
-               &flagSerializeIO,
-               "serialize",
-               false,
-               "Serialize read and write operations on the following volumes.")
-       flag.BoolVar(
-               &flagReadonly,
-               "readonly",
-               false,
-               "Do not write, delete, or touch anything on the following volumes.")
-       flag.StringVar(
-               &pidfile,
-               "pid",
-               "",
-               "Path to write pid file during startup. This file is kept open and locked with LOCK_EX until keepstore exits, so `fuser -k pidfile` is one way to shut down. Exit immediately if there is an error opening, locking, or writing the pid file.")
-       flag.IntVar(
-               &maxBuffers,
-               "max-buffers",
-               maxBuffers,
-               fmt.Sprintf("Maximum RAM to use for data buffers, given in multiples of block size (%d MiB). When this limit is reached, HTTP requests requiring buffers (like GET and PUT) will wait for buffer space to be released.", BlockSize>>20))
-       flag.DurationVar(
-               &trashLifetime,
-               "trash-lifetime",
-               0,
-               "Time duration after a block is trashed during which it can be recovered using an /untrash request")
-       flag.DurationVar(
-               &trashCheckInterval,
-               "trash-check-interval",
-               24*time.Hour,
-               "Time duration at which the emptyTrash goroutine will check and delete expired trashed blocks. Default is one day.")
+       err := config.LoadFile(theConfig, configPath)
+       if err != nil && (!os.IsNotExist(err) || configPath != defaultConfigPath) {
+               log.Fatal(err)
+       }
 
-       flag.Parse()
+       if *dumpConfig {
+               y, err := yaml.Marshal(theConfig)
+               if err != nil {
+                       log.Fatal(err)
+               }
+               os.Stdout.Write(y)
+               os.Exit(0)
+       }
 
-       if maxBuffers < 0 {
-               log.Fatal("-max-buffers must be greater than zero.")
+       err = theConfig.Start()
+       if err != nil {
+               log.Fatal(err)
        }
-       bufs = newBufferPool(maxBuffers, BlockSize)
 
-       if pidfile != "" {
+       if pidfile := theConfig.PIDFile; pidfile != "" {
                f, err := os.OpenFile(pidfile, os.O_RDWR|os.O_CREATE, 0777)
                if err != nil {
                        log.Fatalf("open pidfile (%s): %s", pidfile, err)
                }
+               defer f.Close()
                err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
                if err != nil {
                        log.Fatalf("flock pidfile (%s): %s", pidfile, err)
                }
+               defer os.Remove(pidfile)
                err = f.Truncate(0)
                if err != nil {
                        log.Fatalf("truncate pidfile (%s): %s", pidfile, err)
@@ -259,74 +141,22 @@ func main() {
                if err != nil {
                        log.Fatalf("sync pidfile (%s): %s", pidfile, err)
                }
-               defer f.Close()
-               defer os.Remove(pidfile)
-       }
-
-       if len(volumes) == 0 {
-               if (&unixVolumeAdder{&volumes}).Discover() == 0 {
-                       log.Fatal("No volumes found.")
-               }
-       }
-
-       for _, v := range volumes {
-               log.Printf("Using volume %v (writable=%v)", v, v.Writable())
        }
 
-       // Initialize data manager token and permission key.
-       // If these tokens are specified but cannot be read,
-       // raise a fatal error.
-       if dataManagerTokenFile != "" {
-               if buf, err := ioutil.ReadFile(dataManagerTokenFile); err == nil {
-                       dataManagerToken = strings.TrimSpace(string(buf))
-               } else {
-                       log.Fatalf("reading data manager token: %s\n", err)
-               }
-       }
-
-       if neverDelete != true {
-               log.Print("never-delete is not set. Warning: the relevant features in keepstore and data manager have not " +
-                       "been extensively tested. You should leave this option alone unless you can afford to lose data.")
-       }
-
-       if blobSigningKeyFile != "" {
-               if buf, err := ioutil.ReadFile(blobSigningKeyFile); err == nil {
-                       PermissionSecret = bytes.TrimSpace(buf)
-               } else {
-                       log.Fatalf("reading permission key: %s\n", err)
-               }
-       }
-
-       blobSignatureTTL = time.Duration(permissionTTLSec) * time.Second
-
-       if PermissionSecret == nil {
-               if enforcePermissions {
-                       log.Fatal("-enforce-permissions requires a permission key")
-               } else {
-                       log.Println("Running without a PermissionSecret. Block locators " +
-                               "returned by this server will not be signed, and will be rejected " +
-                               "by a server that enforces permissions.")
-                       log.Println("To fix this, use the -blob-signing-key-file flag " +
-                               "to specify the file containing the permission key.")
-               }
-       }
-
-       if maxRequests <= 0 {
-               maxRequests = maxBuffers * 2
-               log.Printf("-max-requests <1 or not specified; defaulting to maxBuffers * 2 == %d", maxRequests)
-       }
+       log.Println("keepstore starting, pid", os.Getpid())
+       defer log.Println("keepstore exiting, pid", os.Getpid())
 
        // Start a round-robin VolumeManager with the volumes we have found.
-       KeepVM = MakeRRVolumeManager(volumes)
+       KeepVM = MakeRRVolumeManager(theConfig.Volumes)
 
-       // Middleware stack: logger, maxRequests limiter, method handlers
+       // Middleware stack: logger, MaxRequests limiter, method handlers
        http.Handle("/", &LoggingRESTRouter{
-               httpserver.NewRequestLimiter(maxRequests,
+               httpserver.NewRequestLimiter(theConfig.MaxRequests,
                        MakeRESTRouter()),
        })
 
        // Set up a TCP listener.
-       listener, err := net.Listen("tcp", listen)
+       listener, err := net.Listen("tcp", theConfig.Listen)
        if err != nil {
                log.Fatal(err)
        }
@@ -348,7 +178,7 @@ func main() {
 
        // Start emptyTrash goroutine
        doneEmptyingTrash := make(chan bool)
-       go emptyTrash(doneEmptyingTrash, trashCheckInterval)
+       go emptyTrash(doneEmptyingTrash, theConfig.TrashCheckInterval.Duration())
 
        // Shut down the server gracefully (by closing the listener)
        // if SIGTERM is received.
@@ -362,24 +192,27 @@ func main() {
        signal.Notify(term, syscall.SIGTERM)
        signal.Notify(term, syscall.SIGINT)
 
-       log.Println("listening at", listen)
-       srv := &http.Server{Addr: listen}
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
+               log.Printf("Error notifying init daemon: %v", err)
+       }
+       log.Println("listening at", listener.Addr())
+       srv := &http.Server{}
        srv.Serve(listener)
 }
 
-// At every trashCheckInterval tick, invoke EmptyTrash on all volumes.
-func emptyTrash(doneEmptyingTrash chan bool, trashCheckInterval time.Duration) {
-       ticker := time.NewTicker(trashCheckInterval)
+// Periodically (once per interval) invoke EmptyTrash on all volumes.
+func emptyTrash(done <-chan bool, interval time.Duration) {
+       ticker := time.NewTicker(interval)
 
        for {
                select {
                case <-ticker.C:
-                       for _, v := range volumes {
+                       for _, v := range theConfig.Volumes {
                                if v.Writable() {
                                        v.EmptyTrash()
                                }
                        }
-               case <-doneEmptyingTrash:
+               case <-done:
                        ticker.Stop()
                        return
                }
diff --git a/services/keepstore/keepstore.service b/services/keepstore/keepstore.service
new file mode 100644 (file)
index 0000000..b9e2793
--- /dev/null
@@ -0,0 +1,13 @@
+[Unit]
+Description=Arvados Keep Storage Daemon
+Documentation=https://doc.arvados.org/
+After=network.target
+AssertPathExists=/etc/arvados/keepstore/keepstore.yml
+
+[Service]
+Type=notify
+ExecStart=/usr/bin/keepstore
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
index c0adbc0bd74dad7d115dfe70a3374b2815704c56..e1d1dc5cb3cf2eb6ed3bf0b1da0a18b154f03328 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "fmt"
        "io/ioutil"
        "os"
@@ -61,13 +62,13 @@ func TestGetBlock(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllReadable()
-       if err := vols[1].Put(TestHash, TestBlock); err != nil {
+       if err := vols[1].Put(context.Background(), TestHash, TestBlock); err != nil {
                t.Error(err)
        }
 
        // Check that GetBlock returns success.
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(TestHash, buf, nil)
+       size, err := GetBlock(context.Background(), TestHash, buf, nil)
        if err != nil {
                t.Errorf("GetBlock error: %s", err)
        }
@@ -88,7 +89,7 @@ func TestGetBlockMissing(t *testing.T) {
 
        // Check that GetBlock returns failure.
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(TestHash, buf, nil)
+       size, err := GetBlock(context.Background(), TestHash, buf, nil)
        if err != NotFoundError {
                t.Errorf("Expected NotFoundError, got %v, err %v", buf[:size], err)
        }
@@ -106,11 +107,11 @@ func TestGetBlockCorrupt(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllReadable()
-       vols[0].Put(TestHash, BadBlock)
+       vols[0].Put(context.Background(), TestHash, BadBlock)
 
        // Check that GetBlock returns failure.
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(TestHash, buf, nil)
+       size, err := GetBlock(context.Background(), TestHash, buf, nil)
        if err != DiskHashError {
                t.Errorf("Expected DiskHashError, got %v (buf: %v)", err, buf[:size])
        }
@@ -131,13 +132,13 @@ func TestPutBlockOK(t *testing.T) {
        defer KeepVM.Close()
 
        // Check that PutBlock stores the data as expected.
-       if n, err := PutBlock(TestBlock, TestHash); err != nil || n < 1 {
+       if n, err := PutBlock(context.Background(), TestBlock, TestHash); err != nil || n < 1 {
                t.Fatalf("PutBlock: n %d err %v", n, err)
        }
 
        vols := KeepVM.AllReadable()
        buf := make([]byte, BlockSize)
-       n, err := vols[1].Get(TestHash, buf)
+       n, err := vols[1].Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Fatalf("Volume #0 Get returned error: %v", err)
        }
@@ -162,12 +163,12 @@ func TestPutBlockOneVol(t *testing.T) {
        vols[0].(*MockVolume).Bad = true
 
        // Check that PutBlock stores the data as expected.
-       if n, err := PutBlock(TestBlock, TestHash); err != nil || n < 1 {
+       if n, err := PutBlock(context.Background(), TestBlock, TestHash); err != nil || n < 1 {
                t.Fatalf("PutBlock: n %d err %v", n, err)
        }
 
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(TestHash, buf, nil)
+       size, err := GetBlock(context.Background(), TestHash, buf, nil)
        if err != nil {
                t.Fatalf("GetBlock: %v", err)
        }
@@ -190,12 +191,12 @@ func TestPutBlockMD5Fail(t *testing.T) {
 
        // Check that PutBlock returns the expected error when the hash does
        // not match the block.
-       if _, err := PutBlock(BadBlock, TestHash); err != RequestHashError {
+       if _, err := PutBlock(context.Background(), BadBlock, TestHash); err != RequestHashError {
                t.Errorf("Expected RequestHashError, got %v", err)
        }
 
        // Confirm that GetBlock fails to return anything.
-       if result, err := GetBlock(TestHash, make([]byte, BlockSize), nil); err != NotFoundError {
+       if result, err := GetBlock(context.Background(), TestHash, make([]byte, BlockSize), nil); err != NotFoundError {
                t.Errorf("GetBlock succeeded after a corrupt block store (result = %s, err = %v)",
                        string(result), err)
        }
@@ -214,14 +215,14 @@ func TestPutBlockCorrupt(t *testing.T) {
 
        // Store a corrupted block under TestHash.
        vols := KeepVM.AllWritable()
-       vols[0].Put(TestHash, BadBlock)
-       if n, err := PutBlock(TestBlock, TestHash); err != nil || n < 1 {
+       vols[0].Put(context.Background(), TestHash, BadBlock)
+       if n, err := PutBlock(context.Background(), TestBlock, TestHash); err != nil || n < 1 {
                t.Errorf("PutBlock: n %d err %v", n, err)
        }
 
        // The block on disk should now match TestBlock.
        buf := make([]byte, BlockSize)
-       if size, err := GetBlock(TestHash, buf, nil); err != nil {
+       if size, err := GetBlock(context.Background(), TestHash, buf, nil); err != nil {
                t.Errorf("GetBlock: %v", err)
        } else if bytes.Compare(buf[:size], TestBlock) != 0 {
                t.Errorf("Got %+q, expected %+q", buf[:size], TestBlock)
@@ -246,10 +247,10 @@ func TestPutBlockCollision(t *testing.T) {
 
        // Store one block, then attempt to store the other. Confirm that
        // PutBlock reported a CollisionError.
-       if _, err := PutBlock(b1, locator); err != nil {
+       if _, err := PutBlock(context.Background(), b1, locator); err != nil {
                t.Error(err)
        }
-       if _, err := PutBlock(b2, locator); err == nil {
+       if _, err := PutBlock(context.Background(), b2, locator); err == nil {
                t.Error("PutBlock did not report a collision")
        } else if err != CollisionError {
                t.Errorf("PutBlock returned %v", err)
@@ -271,7 +272,7 @@ func TestPutBlockTouchFails(t *testing.T) {
        // Store a block and then make the underlying volume bad,
        // so a subsequent attempt to update the file timestamp
        // will fail.
-       vols[0].Put(TestHash, BadBlock)
+       vols[0].Put(context.Background(), TestHash, BadBlock)
        oldMtime, err := vols[0].Mtime(TestHash)
        if err != nil {
                t.Fatalf("vols[0].Mtime(%s): %s\n", TestHash, err)
@@ -280,7 +281,7 @@ func TestPutBlockTouchFails(t *testing.T) {
        // vols[0].Touch will fail on the next call, so the volume
        // manager will store a copy on vols[1] instead.
        vols[0].(*MockVolume).Touchable = false
-       if n, err := PutBlock(TestBlock, TestHash); err != nil || n < 1 {
+       if n, err := PutBlock(context.Background(), TestBlock, TestHash); err != nil || n < 1 {
                t.Fatalf("PutBlock: n %d err %v", n, err)
        }
        vols[0].(*MockVolume).Touchable = true
@@ -296,7 +297,7 @@ func TestPutBlockTouchFails(t *testing.T) {
                        oldMtime, newMtime)
        }
        buf := make([]byte, BlockSize)
-       n, err := vols[1].Get(TestHash, buf)
+       n, err := vols[1].Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Fatalf("vols[1]: %v", err)
        }
@@ -341,23 +342,23 @@ func TestDiscoverTmpfs(t *testing.T) {
        f.Close()
        ProcMounts = f.Name()
 
-       resultVols := volumeSet{}
-       added := (&unixVolumeAdder{&resultVols}).Discover()
+       cfg := &Config{}
+       added := (&unixVolumeAdder{cfg}).Discover()
 
-       if added != len(resultVols) {
+       if added != len(cfg.Volumes) {
                t.Errorf("Discover returned %d, but added %d volumes",
-                       added, len(resultVols))
+                       added, len(cfg.Volumes))
        }
        if added != len(tempVols) {
                t.Errorf("Discover returned %d but we set up %d volumes",
                        added, len(tempVols))
        }
        for i, tmpdir := range tempVols {
-               if tmpdir != resultVols[i].(*UnixVolume).root {
+               if tmpdir != cfg.Volumes[i].(*UnixVolume).Root {
                        t.Errorf("Discover returned %s, expected %s\n",
-                               resultVols[i].(*UnixVolume).root, tmpdir)
+                               cfg.Volumes[i].(*UnixVolume).Root, tmpdir)
                }
-               if expectReadonly := i%2 == 1; expectReadonly != resultVols[i].(*UnixVolume).readonly {
+               if expectReadonly := i%2 == 1; expectReadonly != cfg.Volumes[i].(*UnixVolume).ReadOnly {
                        t.Errorf("Discover added %s with readonly=%v, should be %v",
                                tmpdir, !expectReadonly, expectReadonly)
                }
@@ -381,10 +382,10 @@ func TestDiscoverNone(t *testing.T) {
        f.Close()
        ProcMounts = f.Name()
 
-       resultVols := volumeSet{}
-       added := (&unixVolumeAdder{&resultVols}).Discover()
-       if added != 0 || len(resultVols) != 0 {
-               t.Fatalf("got %d, %v; expected 0, []", added, resultVols)
+       cfg := &Config{}
+       added := (&unixVolumeAdder{cfg}).Discover()
+       if added != 0 || len(cfg.Volumes) != 0 {
+               t.Fatalf("got %d, %v; expected 0, []", added, cfg.Volumes)
        }
 }
 
@@ -400,11 +401,11 @@ func TestIndex(t *testing.T) {
        defer KeepVM.Close()
 
        vols := KeepVM.AllReadable()
-       vols[0].Put(TestHash, TestBlock)
-       vols[1].Put(TestHash2, TestBlock2)
-       vols[0].Put(TestHash3, TestBlock3)
-       vols[0].Put(TestHash+".meta", []byte("metadata"))
-       vols[1].Put(TestHash2+".meta", []byte("metadata"))
+       vols[0].Put(context.Background(), TestHash, TestBlock)
+       vols[1].Put(context.Background(), TestHash2, TestBlock2)
+       vols[0].Put(context.Background(), TestHash3, TestBlock3)
+       vols[0].Put(context.Background(), TestHash+".meta", []byte("metadata"))
+       vols[1].Put(context.Background(), TestHash2+".meta", []byte("metadata"))
 
        buf := new(bytes.Buffer)
        vols[0].IndexTo("", buf)
@@ -442,8 +443,8 @@ func MakeTestVolumeManager(numVolumes int) VolumeManager {
 
 // teardown cleans up after each test.
 func teardown() {
-       dataManagerToken = ""
-       enforcePermissions = false
-       PermissionSecret = nil
+       theConfig.systemAuthToken = ""
+       theConfig.RequireSignatures = false
+       theConfig.blobSigningKey = nil
        KeepVM = nil
 }
index 9cd97bd3b746b1d66c0eba3b002fe5c9b8d70083..38445d982b438e3b744f09c74727d81d11304c84 100644 (file)
@@ -5,15 +5,10 @@ import (
        "time"
 )
 
-// The PermissionSecret is the secret key used to generate SHA1
-// digests for permission hints. apiserver and Keep must use the same
-// key.
-var PermissionSecret []byte
-
 // SignLocator takes a blobLocator, an apiToken and an expiry time, and
 // returns a signed locator string.
 func SignLocator(blobLocator, apiToken string, expiry time.Time) string {
-       return keepclient.SignLocator(blobLocator, apiToken, expiry, blobSignatureTTL, PermissionSecret)
+       return keepclient.SignLocator(blobLocator, apiToken, expiry, theConfig.BlobSignatureTTL.Duration(), theConfig.blobSigningKey)
 }
 
 // VerifySignature returns nil if the signature on the signedLocator
@@ -22,7 +17,7 @@ func SignLocator(blobLocator, apiToken string, expiry time.Time) string {
 // something the client could have figured out independently) or
 // PermissionError.
 func VerifySignature(signedLocator, apiToken string) error {
-       err := keepclient.VerifySignature(signedLocator, apiToken, blobSignatureTTL, PermissionSecret)
+       err := keepclient.VerifySignature(signedLocator, apiToken, theConfig.BlobSignatureTTL.Duration(), theConfig.blobSigningKey)
        if err == keepclient.ErrSignatureExpired {
                return ExpiredError
        } else if err != nil {
index 43717b23720d8c71b32c126810f8e39dd41a0429..8e47e4a4429c77c99df8b155f33dd6d56b801855 100644 (file)
@@ -4,6 +4,8 @@ import (
        "strconv"
        "testing"
        "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
 )
 
 const (
@@ -17,7 +19,7 @@ const (
                "gokee3eamvjy8qq1fvy238838enjmy5wzy2md7yvsitp5vztft6j4q866efym7e6" +
                "vu5wm9fpnwjyxfldw3vbo01mgjs75rgo7qioh8z8ij7jpyp8508okhgbbex3ceei" +
                "786u5rw2a9gx743dj3fgq2irk"
-       knownSignatureTTL  = 1209600 * time.Second
+       knownSignatureTTL  = arvados.Duration(24 * 14 * time.Hour)
        knownSignature     = "89118b78732c33104a4d6231e8b5a5fa1e4301e3"
        knownTimestamp     = "7fffffff"
        knownSigHint       = "+A" + knownSignature + "@" + knownTimestamp
@@ -26,8 +28,8 @@ const (
 
 func TestSignLocator(t *testing.T) {
        defer func(b []byte) {
-               PermissionSecret = b
-       }(PermissionSecret)
+               theConfig.blobSigningKey = b
+       }(theConfig.blobSigningKey)
 
        tsInt, err := strconv.ParseInt(knownTimestamp, 16, 0)
        if err != nil {
@@ -35,33 +37,33 @@ func TestSignLocator(t *testing.T) {
        }
        t0 := time.Unix(tsInt, 0)
 
-       blobSignatureTTL = knownSignatureTTL
+       theConfig.BlobSignatureTTL = knownSignatureTTL
 
-       PermissionSecret = []byte(knownKey)
+       theConfig.blobSigningKey = []byte(knownKey)
        if x := SignLocator(knownLocator, knownToken, t0); x != knownSignedLocator {
                t.Fatalf("Got %+q, expected %+q", x, knownSignedLocator)
        }
 
-       PermissionSecret = []byte("arbitrarykey")
+       theConfig.blobSigningKey = []byte("arbitrarykey")
        if x := SignLocator(knownLocator, knownToken, t0); x == knownSignedLocator {
-               t.Fatalf("Got same signature %+q, even though PermissionSecret changed", x)
+               t.Fatalf("Got same signature %+q, even though blobSigningKey changed", x)
        }
 }
 
 func TestVerifyLocator(t *testing.T) {
        defer func(b []byte) {
-               PermissionSecret = b
-       }(PermissionSecret)
+               theConfig.blobSigningKey = b
+       }(theConfig.blobSigningKey)
 
-       blobSignatureTTL = knownSignatureTTL
+       theConfig.BlobSignatureTTL = knownSignatureTTL
 
-       PermissionSecret = []byte(knownKey)
+       theConfig.blobSigningKey = []byte(knownKey)
        if err := VerifySignature(knownSignedLocator, knownToken); err != nil {
                t.Fatal(err)
        }
 
-       PermissionSecret = []byte("arbitrarykey")
+       theConfig.blobSigningKey = []byte("arbitrarykey")
        if err := VerifySignature(knownSignedLocator, knownToken); err == nil {
-               t.Fatal("Verified signature even with wrong PermissionSecret")
+               t.Fatal("Verified signature even with wrong blobSigningKey")
        }
 }
index d53d1060e743e07d9d2bfba6b90c67376a1006ab..12860bb662d91a1e31191fed2bccace97bc2ac30 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "context"
        "crypto/rand"
        "fmt"
        "git.curoverse.com/arvados.git/sdk/go/keepclient"
@@ -94,6 +95,6 @@ func GenerateRandomAPIToken() string {
 
 // Put block
 var PutContent = func(content []byte, locator string) (err error) {
-       _, err = PutBlock(content, locator)
+       _, err = PutBlock(context.Background(), content, locator)
        return
 }
index 4d85d5fd20cf6abe408035d294e3d85c5d011251..43a6de68443f693acb85696a0f5938836a34b2f7 100644 (file)
@@ -84,10 +84,10 @@ type PullWorkerTestData struct {
 func (s *PullWorkerTestSuite) TestPullWorkerPullList_with_two_locators(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorkerPullList_with_two_locators",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", firstPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", firstPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 2 pull requests\n",
                readContent:  "hello",
@@ -101,10 +101,10 @@ func (s *PullWorkerTestSuite) TestPullWorkerPullList_with_two_locators(c *C) {
 func (s *PullWorkerTestSuite) TestPullWorkerPullList_with_one_locator(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorkerPullList_with_one_locator",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", secondPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", secondPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 1 pull requests\n",
                readContent:  "hola",
@@ -118,10 +118,10 @@ func (s *PullWorkerTestSuite) TestPullWorkerPullList_with_one_locator(c *C) {
 func (s *PullWorkerTestSuite) TestPullWorker_error_on_get_one_locator(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorker_error_on_get_one_locator",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", secondPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", secondPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 1 pull requests\n",
                readContent:  "unused",
@@ -135,10 +135,10 @@ func (s *PullWorkerTestSuite) TestPullWorker_error_on_get_one_locator(c *C) {
 func (s *PullWorkerTestSuite) TestPullWorker_error_on_get_two_locators(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorker_error_on_get_two_locators",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", firstPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", firstPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 2 pull requests\n",
                readContent:  "unused",
@@ -152,10 +152,10 @@ func (s *PullWorkerTestSuite) TestPullWorker_error_on_get_two_locators(c *C) {
 func (s *PullWorkerTestSuite) TestPullWorker_error_on_put_one_locator(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorker_error_on_put_one_locator",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", secondPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", secondPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 1 pull requests\n",
                readContent:  "hello hello",
@@ -169,10 +169,10 @@ func (s *PullWorkerTestSuite) TestPullWorker_error_on_put_one_locator(c *C) {
 func (s *PullWorkerTestSuite) TestPullWorker_error_on_put_two_locators(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorker_error_on_put_two_locators",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", firstPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", firstPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 2 pull requests\n",
                readContent:  "hello again",
@@ -195,10 +195,10 @@ func (s *PullWorkerTestSuite) TestPullWorkerPullList_with_two_items_latest_repla
        pullq.ReplaceQueue(makeTestWorkList(firstInput))
        testPullLists["Added_before_actual_test_item"] = string(1)
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
        testData := PullWorkerTestData{
                name:         "TestPullWorkerPullList_with_two_items_latest_replacing_old",
-               req:          RequestTester{"/pull", dataManagerToken, "PUT", secondPullList},
+               req:          RequestTester{"/pull", theConfig.systemAuthToken, "PUT", secondPullList},
                responseCode: http.StatusOK,
                responseBody: "Received 1 pull requests\n",
                readContent:  "hola de nuevo",
@@ -210,14 +210,14 @@ func (s *PullWorkerTestSuite) TestPullWorkerPullList_with_two_items_latest_repla
 }
 
 // In this case, the item will not be placed on pullq
-func (s *PullWorkerTestSuite) TestPullWorker_invalid_dataManagerToken(c *C) {
+func (s *PullWorkerTestSuite) TestPullWorker_invalidToken(c *C) {
        defer teardown()
 
-       dataManagerToken = "DATA MANAGER TOKEN"
+       theConfig.systemAuthToken = "DATA MANAGER TOKEN"
 
        testData := PullWorkerTestData{
                name:         "TestPullWorkerPullList_with_two_locators",
-               req:          RequestTester{"/pull", "invalid_dataManagerToken", "PUT", firstPullList},
+               req:          RequestTester{"/pull", "invalidToken", "PUT", firstPullList},
                responseCode: http.StatusUnauthorized,
                responseBody: "Unauthorized\n",
                readContent:  "hello",
index 1a2a47b0df3b27d9c38ae7f4c8986a0f48f933a2..27ac0d9c74992f57fb9091c96dca8dfa59fb6ffc 100644 (file)
@@ -1,22 +1,33 @@
 package main
 
 import (
+       "bytes"
+       "context"
        "encoding/base64"
        "encoding/hex"
        "flag"
        "fmt"
        "io"
+       "io/ioutil"
        "log"
        "net/http"
        "os"
        "regexp"
        "strings"
+       "sync"
+       "sync/atomic"
        "time"
 
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
        "github.com/AdRoll/goamz/aws"
        "github.com/AdRoll/goamz/s3"
 )
 
+const (
+       s3DefaultReadTimeout    = arvados.Duration(10 * time.Minute)
+       s3DefaultConnectTimeout = arvados.Duration(time.Minute)
+)
+
 var (
        // ErrS3TrashDisabled is returned by Trash if that operation
        // is impossible with the current config.
@@ -39,7 +50,12 @@ const (
 )
 
 type s3VolumeAdder struct {
-       *volumeSet
+       *Config
+}
+
+// String implements flag.Value
+func (s *s3VolumeAdder) String() string {
+       return "-"
 }
 
 func (s *s3VolumeAdder) Set(bucketName string) error {
@@ -49,39 +65,21 @@ func (s *s3VolumeAdder) Set(bucketName string) error {
        if s3AccessKeyFile == "" || s3SecretKeyFile == "" {
                return fmt.Errorf("-s3-access-key-file and -s3-secret-key-file arguments must given before -s3-bucket-volume")
        }
-       region, ok := aws.Regions[s3RegionName]
-       if s3Endpoint == "" {
-               if !ok {
-                       return fmt.Errorf("unrecognized region %+q; try specifying -s3-endpoint instead", s3RegionName)
-               }
-       } else {
-               if ok {
-                       return fmt.Errorf("refusing to use AWS region name %+q with endpoint %+q; "+
-                               "specify empty endpoint (\"-s3-endpoint=\") or use a different region name", s3RegionName, s3Endpoint)
-               }
-               region = aws.Region{
-                       Name:       s3RegionName,
-                       S3Endpoint: s3Endpoint,
-               }
-       }
-       var err error
-       var auth aws.Auth
-       auth.AccessKey, err = readKeyFromFile(s3AccessKeyFile)
-       if err != nil {
-               return err
-       }
-       auth.SecretKey, err = readKeyFromFile(s3SecretKeyFile)
-       if err != nil {
-               return err
-       }
-       if flagSerializeIO {
+       if deprecated.flagSerializeIO {
                log.Print("Notice: -serialize is not supported by s3-bucket volumes.")
        }
-       v := NewS3Volume(auth, region, bucketName, s3RaceWindow, flagReadonly, s3Replication)
-       if err := v.Check(); err != nil {
-               return err
-       }
-       *s.volumeSet = append(*s.volumeSet, v)
+       s.Config.Volumes = append(s.Config.Volumes, &S3Volume{
+               Bucket:        bucketName,
+               AccessKeyFile: s3AccessKeyFile,
+               SecretKeyFile: s3SecretKeyFile,
+               Endpoint:      s3Endpoint,
+               Region:        s3RegionName,
+               RaceWindow:    arvados.Duration(s3RaceWindow),
+               S3Replication: s3Replication,
+               UnsafeDelete:  s3UnsafeDelete,
+               ReadOnly:      deprecated.flagReadonly,
+               IndexPageSize: 1000,
+       })
        return nil
 }
 
@@ -93,7 +91,9 @@ func s3regions() (okList []string) {
 }
 
 func init() {
-       flag.Var(&s3VolumeAdder{&volumes},
+       VolumeTypes = append(VolumeTypes, func() VolumeWithExamples { return &S3Volume{} })
+
+       flag.Var(&s3VolumeAdder{theConfig},
                "s3-bucket-volume",
                "Use the given bucket as a storage volume. Can be given multiple times.")
        flag.StringVar(
@@ -110,12 +110,12 @@ func init() {
                &s3AccessKeyFile,
                "s3-access-key-file",
                "",
-               "File containing the access key used for subsequent -s3-bucket-volume arguments.")
+               "`File` containing the access key used for subsequent -s3-bucket-volume arguments.")
        flag.StringVar(
                &s3SecretKeyFile,
                "s3-secret-key-file",
                "",
-               "File containing the secret key used for subsequent -s3-bucket-volume arguments.")
+               "`File` containing the secret key used for subsequent -s3-bucket-volume arguments.")
        flag.DurationVar(
                &s3RaceWindow,
                "s3-race-window",
@@ -135,33 +135,130 @@ func init() {
 
 // S3Volume implements Volume using an S3 bucket.
 type S3Volume struct {
-       *s3.Bucket
-       raceWindow    time.Duration
-       readonly      bool
-       replication   int
-       indexPageSize int
+       AccessKeyFile      string
+       SecretKeyFile      string
+       Endpoint           string
+       Region             string
+       Bucket             string
+       LocationConstraint bool
+       IndexPageSize      int
+       S3Replication      int
+       ConnectTimeout     arvados.Duration
+       ReadTimeout        arvados.Duration
+       RaceWindow         arvados.Duration
+       ReadOnly           bool
+       UnsafeDelete       bool
+
+       bucket *s3bucket
+
+       startOnce sync.Once
+}
+
+// Examples implements VolumeWithExamples.
+func (*S3Volume) Examples() []Volume {
+       return []Volume{
+               &S3Volume{
+                       AccessKeyFile:  "/etc/aws_s3_access_key.txt",
+                       SecretKeyFile:  "/etc/aws_s3_secret_key.txt",
+                       Endpoint:       "",
+                       Region:         "us-east-1",
+                       Bucket:         "example-bucket-name",
+                       IndexPageSize:  1000,
+                       S3Replication:  2,
+                       RaceWindow:     arvados.Duration(24 * time.Hour),
+                       ConnectTimeout: arvados.Duration(time.Minute),
+                       ReadTimeout:    arvados.Duration(5 * time.Minute),
+               },
+               &S3Volume{
+                       AccessKeyFile:  "/etc/gce_s3_access_key.txt",
+                       SecretKeyFile:  "/etc/gce_s3_secret_key.txt",
+                       Endpoint:       "https://storage.googleapis.com",
+                       Region:         "",
+                       Bucket:         "example-bucket-name",
+                       IndexPageSize:  1000,
+                       S3Replication:  2,
+                       RaceWindow:     arvados.Duration(24 * time.Hour),
+                       ConnectTimeout: arvados.Duration(time.Minute),
+                       ReadTimeout:    arvados.Duration(5 * time.Minute),
+               },
+       }
+}
+
+// Type implements Volume.
+func (*S3Volume) Type() string {
+       return "S3"
 }
 
-// NewS3Volume returns a new S3Volume using the given auth, region,
-// and bucket name. The replication argument specifies the replication
-// level to report when writing data.
-func NewS3Volume(auth aws.Auth, region aws.Region, bucket string, raceWindow time.Duration, readonly bool, replication int) *S3Volume {
-       return &S3Volume{
+// Start populates private fields and verifies the configuration is
+// valid.
+func (v *S3Volume) Start() error {
+       region, ok := aws.Regions[v.Region]
+       if v.Endpoint == "" {
+               if !ok {
+                       return fmt.Errorf("unrecognized region %+q; try specifying -s3-endpoint instead", v.Region)
+               }
+       } else if ok {
+               return fmt.Errorf("refusing to use AWS region name %+q with endpoint %+q; "+
+                       "specify empty endpoint (\"-s3-endpoint=\") or use a different region name", v.Region, v.Endpoint)
+       } else {
+               region = aws.Region{
+                       Name:                 v.Region,
+                       S3Endpoint:           v.Endpoint,
+                       S3LocationConstraint: v.LocationConstraint,
+               }
+       }
+
+       var err error
+       var auth aws.Auth
+       auth.AccessKey, err = readKeyFromFile(v.AccessKeyFile)
+       if err != nil {
+               return err
+       }
+       auth.SecretKey, err = readKeyFromFile(v.SecretKeyFile)
+       if err != nil {
+               return err
+       }
+
+       // Zero timeouts mean "wait forever", which is a bad
+       // default. Default to long timeouts instead.
+       if v.ConnectTimeout == 0 {
+               v.ConnectTimeout = s3DefaultConnectTimeout
+       }
+       if v.ReadTimeout == 0 {
+               v.ReadTimeout = s3DefaultReadTimeout
+       }
+
+       client := s3.New(auth, region)
+       client.ConnectTimeout = time.Duration(v.ConnectTimeout)
+       client.ReadTimeout = time.Duration(v.ReadTimeout)
+       v.bucket = &s3bucket{
                Bucket: &s3.Bucket{
-                       S3:   s3.New(auth, region),
-                       Name: bucket,
+                       S3:   client,
+                       Name: v.Bucket,
                },
-               raceWindow:    raceWindow,
-               readonly:      readonly,
-               replication:   replication,
-               indexPageSize: 1000,
        }
+       return nil
 }
 
-// Check returns an error if the volume is inaccessible (e.g., config
-// error).
-func (v *S3Volume) Check() error {
-       return nil
+func (v *S3Volume) getReaderWithContext(ctx context.Context, loc string) (rdr io.ReadCloser, err error) {
+       ready := make(chan bool)
+       go func() {
+               rdr, err = v.getReader(loc)
+               close(ready)
+       }()
+       select {
+       case <-ready:
+               return
+       case <-ctx.Done():
+               theConfig.debugLogf("s3: abandoning getReader(): %s", ctx.Err())
+               go func() {
+                       <-ready
+                       if err == nil {
+                               rdr.Close()
+                       }
+               }()
+               return nil, ctx.Err()
+       }
 }
 
 // getReader wraps (Bucket)GetReader.
@@ -170,12 +267,13 @@ func (v *S3Volume) Check() error {
 // disappeared in a Trash race, getReader calls fixRace to recover the
 // data, and tries again.
 func (v *S3Volume) getReader(loc string) (rdr io.ReadCloser, err error) {
-       rdr, err = v.Bucket.GetReader(loc)
+       rdr, err = v.bucket.GetReader(loc)
        err = v.translateError(err)
        if err == nil || !os.IsNotExist(err) {
                return
        }
-       _, err = v.Bucket.Head("recent/"+loc, nil)
+
+       _, err = v.bucket.Head("recent/"+loc, nil)
        err = v.translateError(err)
        if err != nil {
                // If we can't read recent/X, there's no point in
@@ -186,7 +284,8 @@ func (v *S3Volume) getReader(loc string) (rdr io.ReadCloser, err error) {
                err = os.ErrNotExist
                return
        }
-       rdr, err = v.Bucket.GetReader(loc)
+
+       rdr, err = v.bucket.GetReader(loc)
        if err != nil {
                log.Printf("warning: reading %s after successful fixRace: %s", loc, err)
                err = v.translateError(err)
@@ -196,58 +295,114 @@ func (v *S3Volume) getReader(loc string) (rdr io.ReadCloser, err error) {
 
 // Get a block: copy the block data into buf, and return the number of
 // bytes copied.
-func (v *S3Volume) Get(loc string, buf []byte) (int, error) {
-       rdr, err := v.getReader(loc)
+func (v *S3Volume) Get(ctx context.Context, loc string, buf []byte) (int, error) {
+       rdr, err := v.getReaderWithContext(ctx, loc)
        if err != nil {
                return 0, err
        }
-       defer rdr.Close()
-       n, err := io.ReadFull(rdr, buf)
-       switch err {
-       case nil, io.EOF, io.ErrUnexpectedEOF:
-               return n, nil
-       default:
-               return 0, v.translateError(err)
+
+       var n int
+       ready := make(chan bool)
+       go func() {
+               defer close(ready)
+
+               defer rdr.Close()
+               n, err = io.ReadFull(rdr, buf)
+
+               switch err {
+               case nil, io.EOF, io.ErrUnexpectedEOF:
+                       err = nil
+               default:
+                       err = v.translateError(err)
+               }
+       }()
+       select {
+       case <-ctx.Done():
+               theConfig.debugLogf("s3: interrupting ReadFull() with Close() because %s", ctx.Err())
+               rdr.Close()
+               // Must wait for ReadFull to return, to ensure it
+               // doesn't write to buf after we return.
+               theConfig.debugLogf("s3: waiting for ReadFull() to fail")
+               <-ready
+               return 0, ctx.Err()
+       case <-ready:
+               return n, err
        }
 }
 
 // Compare the given data with the stored data.
-func (v *S3Volume) Compare(loc string, expect []byte) error {
-       rdr, err := v.getReader(loc)
+func (v *S3Volume) Compare(ctx context.Context, loc string, expect []byte) error {
+       rdr, err := v.getReaderWithContext(ctx, loc)
        if err != nil {
                return err
        }
        defer rdr.Close()
-       return v.translateError(compareReaderWithBuf(rdr, expect, loc[:32]))
+       return v.translateError(compareReaderWithBuf(ctx, rdr, expect, loc[:32]))
 }
 
 // Put writes a block.
-func (v *S3Volume) Put(loc string, block []byte) error {
-       if v.readonly {
+func (v *S3Volume) Put(ctx context.Context, loc string, block []byte) error {
+       if v.ReadOnly {
                return MethodDisabledError
        }
        var opts s3.Options
-       if len(block) > 0 {
+       size := len(block)
+       if size > 0 {
                md5, err := hex.DecodeString(loc)
                if err != nil {
                        return err
                }
                opts.ContentMD5 = base64.StdEncoding.EncodeToString(md5)
        }
-       err := v.Bucket.Put(loc, block, "application/octet-stream", s3ACL, opts)
-       if err != nil {
+
+       // Send the block data through a pipe, so that (if we need to)
+       // we can close the pipe early and abandon our PutReader()
+       // goroutine, without worrying about PutReader() accessing our
+       // block buffer after we release it.
+       bufr, bufw := io.Pipe()
+       go func() {
+               io.Copy(bufw, bytes.NewReader(block))
+               bufw.Close()
+       }()
+
+       var err error
+       ready := make(chan bool)
+       go func() {
+               defer func() {
+                       if ctx.Err() != nil {
+                               theConfig.debugLogf("%s: abandoned PutReader goroutine finished with err: %s", v, err)
+                       }
+               }()
+               defer close(ready)
+               err = v.bucket.PutReader(loc, bufr, int64(size), "application/octet-stream", s3ACL, opts)
+               if err != nil {
+                       return
+               }
+               err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+       }()
+       select {
+       case <-ctx.Done():
+               theConfig.debugLogf("%s: taking PutReader's input away: %s", v, ctx.Err())
+               // Our pipe might be stuck in Write(), waiting for
+               // io.Copy() to read. If so, un-stick it. This means
+               // PutReader will get corrupt data, but that's OK: the
+               // size and MD5 won't match, so the write will fail.
+               go io.Copy(ioutil.Discard, bufr)
+               // CloseWithError() will return once pending I/O is done.
+               bufw.CloseWithError(ctx.Err())
+               theConfig.debugLogf("%s: abandoning PutReader goroutine", v)
+               return ctx.Err()
+       case <-ready:
                return v.translateError(err)
        }
-       err = v.Bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
-       return v.translateError(err)
 }
 
 // Touch sets the timestamp for the given locator to the current time.
 func (v *S3Volume) Touch(loc string) error {
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
-       _, err := v.Bucket.Head(loc, nil)
+       _, err := v.bucket.Head(loc, nil)
        err = v.translateError(err)
        if os.IsNotExist(err) && v.fixRace(loc) {
                // The data object got trashed in a race, but fixRace
@@ -255,27 +410,27 @@ func (v *S3Volume) Touch(loc string) error {
        } else if err != nil {
                return err
        }
-       err = v.Bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+       err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
        return v.translateError(err)
 }
 
 // Mtime returns the stored timestamp for the given locator.
 func (v *S3Volume) Mtime(loc string) (time.Time, error) {
-       _, err := v.Bucket.Head(loc, nil)
+       _, err := v.bucket.Head(loc, nil)
        if err != nil {
                return zeroTime, v.translateError(err)
        }
-       resp, err := v.Bucket.Head("recent/"+loc, nil)
+       resp, err := v.bucket.Head("recent/"+loc, nil)
        err = v.translateError(err)
        if os.IsNotExist(err) {
                // The data object X exists, but recent/X is missing.
-               err = v.Bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+               err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
                if err != nil {
                        log.Printf("error: creating %q: %s", "recent/"+loc, err)
                        return zeroTime, v.translateError(err)
                }
                log.Printf("info: created %q to migrate existing block to new storage scheme", "recent/"+loc)
-               resp, err = v.Bucket.Head("recent/"+loc, nil)
+               resp, err = v.bucket.Head("recent/"+loc, nil)
                if err != nil {
                        log.Printf("error: created %q but HEAD failed: %s", "recent/"+loc, err)
                        return zeroTime, v.translateError(err)
@@ -292,16 +447,19 @@ func (v *S3Volume) Mtime(loc string) (time.Time, error) {
 func (v *S3Volume) IndexTo(prefix string, writer io.Writer) error {
        // Use a merge sort to find matching sets of X and recent/X.
        dataL := s3Lister{
-               Bucket:   v.Bucket,
+               Bucket:   v.bucket.Bucket,
                Prefix:   prefix,
-               PageSize: v.indexPageSize,
+               PageSize: v.IndexPageSize,
        }
        recentL := s3Lister{
-               Bucket:   v.Bucket,
+               Bucket:   v.bucket.Bucket,
                Prefix:   "recent/" + prefix,
-               PageSize: v.indexPageSize,
+               PageSize: v.IndexPageSize,
        }
+       v.bucket.stats.tick(&v.bucket.stats.Ops, &v.bucket.stats.ListOps)
+       v.bucket.stats.tick(&v.bucket.stats.Ops, &v.bucket.stats.ListOps)
        for data, recent := dataL.First(), recentL.First(); data != nil; data = dataL.Next() {
+               v.bucket.stats.tick(&v.bucket.stats.Ops, &v.bucket.stats.ListOps)
                if data.Key >= "g" {
                        // Conveniently, "recent/*" and "trash/*" are
                        // lexically greater than all hex-encoded data
@@ -323,10 +481,12 @@ func (v *S3Volume) IndexTo(prefix string, writer io.Writer) error {
                for recent != nil {
                        if cmp := strings.Compare(recent.Key[7:], data.Key); cmp < 0 {
                                recent = recentL.Next()
+                               v.bucket.stats.tick(&v.bucket.stats.Ops, &v.bucket.stats.ListOps)
                                continue
                        } else if cmp == 0 {
                                stamp = recent
                                recent = recentL.Next()
+                               v.bucket.stats.tick(&v.bucket.stats.Ops, &v.bucket.stats.ListOps)
                                break
                        } else {
                                // recent/X marker is missing: we'll
@@ -346,19 +506,19 @@ func (v *S3Volume) IndexTo(prefix string, writer io.Writer) error {
 
 // Trash a Keep block.
 func (v *S3Volume) Trash(loc string) error {
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
        if t, err := v.Mtime(loc); err != nil {
                return err
-       } else if time.Since(t) < blobSignatureTTL {
+       } else if time.Since(t) < theConfig.BlobSignatureTTL.Duration() {
                return nil
        }
-       if trashLifetime == 0 {
+       if theConfig.TrashLifetime == 0 {
                if !s3UnsafeDelete {
                        return ErrS3TrashDisabled
                }
-               return v.Bucket.Del(loc)
+               return v.translateError(v.bucket.Del(loc))
        }
        err := v.checkRaceWindow(loc)
        if err != nil {
@@ -368,13 +528,13 @@ func (v *S3Volume) Trash(loc string) error {
        if err != nil {
                return err
        }
-       return v.translateError(v.Bucket.Del(loc))
+       return v.translateError(v.bucket.Del(loc))
 }
 
 // checkRaceWindow returns a non-nil error if trash/loc is, or might
 // be, in the race window (i.e., it's not safe to trash loc).
 func (v *S3Volume) checkRaceWindow(loc string) error {
-       resp, err := v.Bucket.Head("trash/"+loc, nil)
+       resp, err := v.bucket.Head("trash/"+loc, nil)
        err = v.translateError(err)
        if os.IsNotExist(err) {
                // OK, trash/X doesn't exist so we're not in the race
@@ -390,7 +550,7 @@ func (v *S3Volume) checkRaceWindow(loc string) error {
                // Can't parse timestamp
                return err
        }
-       safeWindow := t.Add(trashLifetime).Sub(time.Now().Add(v.raceWindow))
+       safeWindow := t.Add(theConfig.TrashLifetime.Duration()).Sub(time.Now().Add(time.Duration(v.RaceWindow)))
        if safeWindow <= 0 {
                // We can't count on "touch trash/X" to prolong
                // trash/X's lifetime. The new timestamp might not
@@ -408,10 +568,10 @@ func (v *S3Volume) checkRaceWindow(loc string) error {
 // (PutCopy returns 200 OK if the request was received, even if the
 // copy failed).
 func (v *S3Volume) safeCopy(dst, src string) error {
-       resp, err := v.Bucket.PutCopy(dst, s3ACL, s3.CopyOptions{
+       resp, err := v.bucket.PutCopy(dst, s3ACL, s3.CopyOptions{
                ContentType:       "application/octet-stream",
                MetadataDirective: "REPLACE",
-       }, v.Bucket.Name+"/"+src)
+       }, v.bucket.Name+"/"+src)
        err = v.translateError(err)
        if err != nil {
                return err
@@ -446,7 +606,7 @@ func (v *S3Volume) Untrash(loc string) error {
        if err != nil {
                return err
        }
-       err = v.Bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+       err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
        return v.translateError(err)
 }
 
@@ -461,21 +621,26 @@ func (v *S3Volume) Status() *VolumeStatus {
        }
 }
 
+// InternalStats returns bucket I/O and API call counters.
+func (v *S3Volume) InternalStats() interface{} {
+       return &v.bucket.stats
+}
+
 // String implements fmt.Stringer.
 func (v *S3Volume) String() string {
-       return fmt.Sprintf("s3-bucket:%+q", v.Bucket.Name)
+       return fmt.Sprintf("s3-bucket:%+q", v.Bucket)
 }
 
 // Writable returns false if all future Put, Mtime, and Delete calls
 // are expected to fail.
 func (v *S3Volume) Writable() bool {
-       return !v.readonly
+       return !v.ReadOnly
 }
 
 // Replication returns the storage redundancy of the underlying
 // device. Configured via command line flag.
 func (v *S3Volume) Replication() int {
-       return v.replication
+       return v.S3Replication
 }
 
 var s3KeepBlockRegexp = regexp.MustCompile(`^[0-9a-f]{32}$`)
@@ -489,7 +654,7 @@ func (v *S3Volume) isKeepBlock(s string) bool {
 // there was a race between Put and Trash, fixRace recovers from the
 // race by Untrashing the block.
 func (v *S3Volume) fixRace(loc string) bool {
-       trash, err := v.Bucket.Head("trash/"+loc, nil)
+       trash, err := v.bucket.Head("trash/"+loc, nil)
        if err != nil {
                if !os.IsNotExist(v.translateError(err)) {
                        log.Printf("error: fixRace: HEAD %q: %s", "trash/"+loc, err)
@@ -502,7 +667,7 @@ func (v *S3Volume) fixRace(loc string) bool {
                return false
        }
 
-       recent, err := v.Bucket.Head("recent/"+loc, nil)
+       recent, err := v.bucket.Head("recent/"+loc, nil)
        if err != nil {
                log.Printf("error: fixRace: HEAD %q: %s", "recent/"+loc, err)
                return false
@@ -514,13 +679,13 @@ func (v *S3Volume) fixRace(loc string) bool {
        }
 
        ageWhenTrashed := trashTime.Sub(recentTime)
-       if ageWhenTrashed >= blobSignatureTTL {
+       if ageWhenTrashed >= theConfig.BlobSignatureTTL.Duration() {
                // No evidence of a race: block hasn't been written
                // since it became eligible for Trash. No fix needed.
                return false
        }
 
-       log.Printf("notice: fixRace: %q: trashed at %s but touched at %s (age when trashed = %s < %s)", loc, trashTime, recentTime, ageWhenTrashed, blobSignatureTTL)
+       log.Printf("notice: fixRace: %q: trashed at %s but touched at %s (age when trashed = %s < %s)", loc, trashTime, recentTime, ageWhenTrashed, theConfig.BlobSignatureTTL)
        log.Printf("notice: fixRace: copying %q to %q to recover from race between Put/Touch and Trash", "recent/"+loc, loc)
        err = v.safeCopy(loc, "trash/"+loc)
        if err != nil {
@@ -545,16 +710,16 @@ func (v *S3Volume) translateError(err error) error {
        return err
 }
 
-// EmptyTrash looks for trashed blocks that exceeded trashLifetime
+// EmptyTrash looks for trashed blocks that exceeded TrashLifetime
 // and deletes them from the volume.
 func (v *S3Volume) EmptyTrash() {
        var bytesInTrash, blocksInTrash, bytesDeleted, blocksDeleted int64
 
        // Use a merge sort to find matching sets of trash/X and recent/X.
        trashL := s3Lister{
-               Bucket:   v.Bucket,
+               Bucket:   v.bucket.Bucket,
                Prefix:   "trash/",
-               PageSize: v.indexPageSize,
+               PageSize: v.IndexPageSize,
        }
        // Define "ready to delete" as "...when EmptyTrash started".
        startT := time.Now()
@@ -571,7 +736,7 @@ func (v *S3Volume) EmptyTrash() {
                        log.Printf("warning: %s: EmptyTrash: %q: parse %q: %s", v, trash.Key, trash.LastModified, err)
                        continue
                }
-               recent, err := v.Bucket.Head("recent/"+loc, nil)
+               recent, err := v.bucket.Head("recent/"+loc, nil)
                if err != nil && os.IsNotExist(v.translateError(err)) {
                        log.Printf("warning: %s: EmptyTrash: found trash marker %q but no %q (%s); calling Untrash", v, trash.Key, "recent/"+loc, err)
                        err = v.Untrash(loc)
@@ -588,21 +753,23 @@ func (v *S3Volume) EmptyTrash() {
                        log.Printf("warning: %s: EmptyTrash: %q: parse %q: %s", v, "recent/"+loc, recent.Header.Get("Last-Modified"), err)
                        continue
                }
-               if trashT.Sub(recentT) < blobSignatureTTL {
-                       if age := startT.Sub(recentT); age >= blobSignatureTTL-v.raceWindow {
+               if trashT.Sub(recentT) < theConfig.BlobSignatureTTL.Duration() {
+                       if age := startT.Sub(recentT); age >= theConfig.BlobSignatureTTL.Duration()-time.Duration(v.RaceWindow) {
                                // recent/loc is too old to protect
                                // loc from being Trashed again during
                                // the raceWindow that starts if we
                                // delete trash/X now.
                                //
-                               // Note this means (trashCheckInterval
-                               // < blobSignatureTTL - raceWindow) is
+                               // Note this means (TrashCheckInterval
+                               // < BlobSignatureTTL - raceWindow) is
                                // necessary to avoid starvation.
                                log.Printf("notice: %s: EmptyTrash: detected old race for %q, calling fixRace + Touch", v, loc)
                                v.fixRace(loc)
                                v.Touch(loc)
                                continue
-                       } else if _, err := v.Bucket.Head(loc, nil); os.IsNotExist(err) {
+                       }
+                       _, err := v.bucket.Head(loc, nil)
+                       if os.IsNotExist(err) {
                                log.Printf("notice: %s: EmptyTrash: detected recent race for %q, calling fixRace", v, loc)
                                v.fixRace(loc)
                                continue
@@ -611,10 +778,10 @@ func (v *S3Volume) EmptyTrash() {
                                continue
                        }
                }
-               if startT.Sub(trashT) < trashLifetime {
+               if startT.Sub(trashT) < theConfig.TrashLifetime.Duration() {
                        continue
                }
-               err = v.Bucket.Del(trash.Key)
+               err = v.bucket.Del(trash.Key)
                if err != nil {
                        log.Printf("warning: %s: EmptyTrash: deleting %q: %s", v, trash.Key, err)
                        continue
@@ -622,9 +789,9 @@ func (v *S3Volume) EmptyTrash() {
                bytesDeleted += trash.Size
                blocksDeleted++
 
-               _, err = v.Bucket.Head(loc, nil)
+               _, err = v.bucket.Head(loc, nil)
                if os.IsNotExist(err) {
-                       err = v.Bucket.Del("recent/" + loc)
+                       err = v.bucket.Del("recent/" + loc)
                        if err != nil {
                                log.Printf("warning: %s: EmptyTrash: deleting %q: %s", v, "recent/"+loc, err)
                        }
@@ -696,3 +863,91 @@ func (lister *s3Lister) pop() (k *s3.Key) {
        }
        return
 }
+
+// s3bucket wraps s3.bucket and counts I/O and API usage stats.
+type s3bucket struct {
+       *s3.Bucket
+       stats s3bucketStats
+}
+
+func (b *s3bucket) GetReader(path string) (io.ReadCloser, error) {
+       rdr, err := b.Bucket.GetReader(path)
+       b.stats.tick(&b.stats.Ops, &b.stats.GetOps)
+       b.stats.tickErr(err)
+       return NewCountingReader(rdr, b.stats.tickInBytes), err
+}
+
+func (b *s3bucket) Head(path string, headers map[string][]string) (*http.Response, error) {
+       resp, err := b.Bucket.Head(path, headers)
+       b.stats.tick(&b.stats.Ops, &b.stats.HeadOps)
+       b.stats.tickErr(err)
+       return resp, err
+}
+
+func (b *s3bucket) PutReader(path string, r io.Reader, length int64, contType string, perm s3.ACL, options s3.Options) error {
+       err := b.Bucket.PutReader(path, NewCountingReader(r, b.stats.tickOutBytes), length, contType, perm, options)
+       b.stats.tick(&b.stats.Ops, &b.stats.PutOps)
+       b.stats.tickErr(err)
+       return err
+}
+
+func (b *s3bucket) Put(path string, data []byte, contType string, perm s3.ACL, options s3.Options) error {
+       err := b.Bucket.PutReader(path, NewCountingReader(bytes.NewBuffer(data), b.stats.tickOutBytes), int64(len(data)), contType, perm, options)
+       b.stats.tick(&b.stats.Ops, &b.stats.PutOps)
+       b.stats.tickErr(err)
+       return err
+}
+
+func (b *s3bucket) Del(path string) error {
+       err := b.Bucket.Del(path)
+       b.stats.tick(&b.stats.Ops, &b.stats.DelOps)
+       b.stats.tickErr(err)
+       return err
+}
+
+type s3bucketStats struct {
+       Errors   uint64
+       Ops      uint64
+       GetOps   uint64
+       PutOps   uint64
+       HeadOps  uint64
+       DelOps   uint64
+       ListOps  uint64
+       InBytes  uint64
+       OutBytes uint64
+
+       ErrorCodes map[string]uint64 `json:",omitempty"`
+
+       lock sync.Mutex
+}
+
+func (s *s3bucketStats) tickInBytes(n uint64) {
+       atomic.AddUint64(&s.InBytes, n)
+}
+
+func (s *s3bucketStats) tickOutBytes(n uint64) {
+       atomic.AddUint64(&s.OutBytes, n)
+}
+
+func (s *s3bucketStats) tick(counters ...*uint64) {
+       for _, counter := range counters {
+               atomic.AddUint64(counter, 1)
+       }
+}
+
+func (s *s3bucketStats) tickErr(err error) {
+       if err == nil {
+               return
+       }
+       atomic.AddUint64(&s.Errors, 1)
+       errStr := fmt.Sprintf("%T", err)
+       if err, ok := err.(*s3.Error); ok {
+               errStr = errStr + fmt.Sprintf(" %d %s", err.StatusCode, err.Code)
+       }
+       s.lock.Lock()
+       if s.ErrorCodes == nil {
+               s.ErrorCodes = make(map[string]uint64)
+       }
+       s.ErrorCodes[errStr]++
+       s.lock.Unlock()
+}
index 6ba390426f51dbe4f8ef1d6ac2ce2a27b4d3f3b2..10e915852ca75e31cfbbe629198de52821e5ab3a 100644 (file)
@@ -2,25 +2,21 @@ package main
 
 import (
        "bytes"
+       "context"
        "crypto/md5"
+       "encoding/json"
        "fmt"
+       "io/ioutil"
        "log"
        "os"
        "time"
 
-       "github.com/AdRoll/goamz/aws"
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
        "github.com/AdRoll/goamz/s3"
        "github.com/AdRoll/goamz/s3/s3test"
        check "gopkg.in/check.v1"
 )
 
-type TestableS3Volume struct {
-       *S3Volume
-       server      *s3test.Server
-       c           *check.C
-       serverClock *fakeClock
-}
-
 const (
        TestBucketName = "testbucket"
 )
@@ -42,30 +38,6 @@ func init() {
        s3UnsafeDelete = true
 }
 
-func NewTestableS3Volume(c *check.C, raceWindow time.Duration, readonly bool, replication int) *TestableS3Volume {
-       clock := &fakeClock{}
-       srv, err := s3test.NewServer(&s3test.Config{Clock: clock})
-       c.Assert(err, check.IsNil)
-       auth := aws.Auth{}
-       region := aws.Region{
-               Name:                 "test-region-1",
-               S3Endpoint:           srv.URL(),
-               S3LocationConstraint: true,
-       }
-       bucket := &s3.Bucket{
-               S3:   s3.New(auth, region),
-               Name: TestBucketName,
-       }
-       err = bucket.PutBucket(s3.ACL("private"))
-       c.Assert(err, check.IsNil)
-
-       return &TestableS3Volume{
-               S3Volume:    NewS3Volume(auth, region, TestBucketName, raceWindow, readonly, replication),
-               server:      srv,
-               serverClock: clock,
-       }
-}
-
 var _ = check.Suite(&StubbedS3Suite{})
 
 type StubbedS3Suite struct {
@@ -76,19 +48,19 @@ func (s *StubbedS3Suite) TestGeneric(c *check.C) {
        DoGenericVolumeTests(c, func(t TB) TestableVolume {
                // Use a negative raceWindow so s3test's 1-second
                // timestamp precision doesn't confuse fixRace.
-               return NewTestableS3Volume(c, -2*time.Second, false, 2)
+               return s.newTestableVolume(c, -2*time.Second, false, 2)
        })
 }
 
 func (s *StubbedS3Suite) TestGenericReadOnly(c *check.C) {
        DoGenericVolumeTests(c, func(t TB) TestableVolume {
-               return NewTestableS3Volume(c, -2*time.Second, true, 2)
+               return s.newTestableVolume(c, -2*time.Second, true, 2)
        })
 }
 
 func (s *StubbedS3Suite) TestIndex(c *check.C) {
-       v := NewTestableS3Volume(c, 0, false, 2)
-       v.indexPageSize = 3
+       v := s.newTestableVolume(c, 0, false, 2)
+       v.IndexPageSize = 3
        for i := 0; i < 256; i++ {
                v.PutRaw(fmt.Sprintf("%02x%030x", i, i), []byte{102, 111, 111})
        }
@@ -111,15 +83,44 @@ func (s *StubbedS3Suite) TestIndex(c *check.C) {
        }
 }
 
+func (s *StubbedS3Suite) TestStats(c *check.C) {
+       v := s.newTestableVolume(c, 5*time.Minute, false, 2)
+       stats := func() string {
+               buf, err := json.Marshal(v.InternalStats())
+               c.Check(err, check.IsNil)
+               return string(buf)
+       }
+
+       c.Check(stats(), check.Matches, `.*"Ops":0,.*`)
+
+       loc := "acbd18db4cc2f85cedef654fccc4a4d8"
+       _, err := v.Get(context.Background(), loc, make([]byte, 3))
+       c.Check(err, check.NotNil)
+       c.Check(stats(), check.Matches, `.*"Ops":[^0],.*`)
+       c.Check(stats(), check.Matches, `.*"\*s3.Error 404 [^"]*":[^0].*`)
+       c.Check(stats(), check.Matches, `.*"InBytes":0,.*`)
+
+       err = v.Put(context.Background(), loc, []byte("foo"))
+       c.Check(err, check.IsNil)
+       c.Check(stats(), check.Matches, `.*"OutBytes":3,.*`)
+       c.Check(stats(), check.Matches, `.*"PutOps":2,.*`)
+
+       _, err = v.Get(context.Background(), loc, make([]byte, 3))
+       c.Check(err, check.IsNil)
+       _, err = v.Get(context.Background(), loc, make([]byte, 3))
+       c.Check(err, check.IsNil)
+       c.Check(stats(), check.Matches, `.*"InBytes":6,.*`)
+}
+
 func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
-       defer func(tl, bs time.Duration) {
-               trashLifetime = tl
-               blobSignatureTTL = bs
-       }(trashLifetime, blobSignatureTTL)
-       trashLifetime = time.Hour
-       blobSignatureTTL = time.Hour
-
-       v := NewTestableS3Volume(c, 5*time.Minute, false, 2)
+       defer func(tl, bs arvados.Duration) {
+               theConfig.TrashLifetime = tl
+               theConfig.BlobSignatureTTL = bs
+       }(theConfig.TrashLifetime, theConfig.BlobSignatureTTL)
+       theConfig.TrashLifetime.Set("1h")
+       theConfig.BlobSignatureTTL.Set("1h")
+
+       v := s.newTestableVolume(c, 5*time.Minute, false, 2)
        var none time.Time
 
        putS3Obj := func(t time.Time, key string, data []byte) {
@@ -127,7 +128,7 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                        return
                }
                v.serverClock.now = &t
-               v.Bucket.Put(key, data, "application/octet-stream", s3ACL, s3.Options{})
+               v.bucket.Put(key, data, "application/octet-stream", s3ACL, s3.Options{})
        }
 
        t0 := time.Now()
@@ -214,12 +215,12 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                        false, false, false, true, false, false,
                },
                {
-                       "Erroneously trashed during a race, detected before trashLifetime",
+                       "Erroneously trashed during a race, detected before TrashLifetime",
                        none, t0.Add(-30 * time.Minute), t0.Add(-29 * time.Minute),
                        true, false, true, true, true, false,
                },
                {
-                       "Erroneously trashed during a race, rescue during EmptyTrash despite reaching trashLifetime",
+                       "Erroneously trashed during a race, rescue during EmptyTrash despite reaching TrashLifetime",
                        none, t0.Add(-90 * time.Minute), t0.Add(-89 * time.Minute),
                        true, false, true, true, true, false,
                },
@@ -253,7 +254,7 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                // Check canGet
                loc, blk := setupScenario()
                buf := make([]byte, len(blk))
-               _, err := v.Get(loc, buf)
+               _, err := v.Get(context.Background(), loc, buf)
                c.Check(err == nil, check.Equals, scenario.canGet)
                if err != nil {
                        c.Check(os.IsNotExist(err), check.Equals, true)
@@ -263,7 +264,7 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                loc, blk = setupScenario()
                err = v.Trash(loc)
                c.Check(err == nil, check.Equals, scenario.canTrash)
-               _, err = v.Get(loc, buf)
+               _, err = v.Get(context.Background(), loc, buf)
                c.Check(err == nil, check.Equals, scenario.canGetAfterTrash)
                if err != nil {
                        c.Check(os.IsNotExist(err), check.Equals, true)
@@ -278,7 +279,7 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                        // should be able to Get after Untrash --
                        // regardless of timestamps, errors, race
                        // conditions, etc.
-                       _, err = v.Get(loc, buf)
+                       _, err = v.Get(context.Background(), loc, buf)
                        c.Check(err, check.IsNil)
                }
 
@@ -286,7 +287,7 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                // freshAfterEmpty
                loc, blk = setupScenario()
                v.EmptyTrash()
-               _, err = v.Bucket.Head("trash/"+loc, nil)
+               _, err = v.bucket.Head("trash/"+loc, nil)
                c.Check(err == nil, check.Equals, scenario.haveTrashAfterEmpty)
                if scenario.freshAfterEmpty {
                        t, err := v.Mtime(loc)
@@ -299,7 +300,7 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
                // Check for current Mtime after Put (applies to all
                // scenarios)
                loc, blk = setupScenario()
-               err = v.Put(loc, blk)
+               err = v.Put(context.Background(), loc, blk)
                c.Check(err, check.IsNil)
                t, err := v.Mtime(loc)
                c.Check(err, check.IsNil)
@@ -307,9 +308,51 @@ func (s *StubbedS3Suite) TestBackendStates(c *check.C) {
        }
 }
 
+type TestableS3Volume struct {
+       *S3Volume
+       server      *s3test.Server
+       c           *check.C
+       serverClock *fakeClock
+}
+
+func (s *StubbedS3Suite) newTestableVolume(c *check.C, raceWindow time.Duration, readonly bool, replication int) *TestableS3Volume {
+       clock := &fakeClock{}
+       srv, err := s3test.NewServer(&s3test.Config{Clock: clock})
+       c.Assert(err, check.IsNil)
+
+       tmp, err := ioutil.TempFile("", "keepstore")
+       c.Assert(err, check.IsNil)
+       defer os.Remove(tmp.Name())
+       _, err = tmp.Write([]byte("xxx\n"))
+       c.Assert(err, check.IsNil)
+       c.Assert(tmp.Close(), check.IsNil)
+
+       v := &TestableS3Volume{
+               S3Volume: &S3Volume{
+                       Bucket:             TestBucketName,
+                       AccessKeyFile:      tmp.Name(),
+                       SecretKeyFile:      tmp.Name(),
+                       Endpoint:           srv.URL(),
+                       Region:             "test-region-1",
+                       LocationConstraint: true,
+                       RaceWindow:         arvados.Duration(raceWindow),
+                       S3Replication:      replication,
+                       UnsafeDelete:       s3UnsafeDelete,
+                       ReadOnly:           readonly,
+                       IndexPageSize:      1000,
+               },
+               server:      srv,
+               serverClock: clock,
+       }
+       c.Assert(v.Start(), check.IsNil)
+       err = v.bucket.PutBucket(s3.ACL("private"))
+       c.Assert(err, check.IsNil)
+       return v
+}
+
 // PutRaw skips the ContentMD5 test
 func (v *TestableS3Volume) PutRaw(loc string, block []byte) {
-       err := v.Bucket.Put(loc, block, "application/octet-stream", s3ACL, s3.Options{})
+       err := v.bucket.Put(loc, block, "application/octet-stream", s3ACL, s3.Options{})
        if err != nil {
                log.Printf("PutRaw: %+v", err)
        }
@@ -320,7 +363,7 @@ func (v *TestableS3Volume) PutRaw(loc string, block []byte) {
 // while we do this.
 func (v *TestableS3Volume) TouchWithDate(locator string, lastPut time.Time) {
        v.serverClock.now = &lastPut
-       err := v.Bucket.Put("recent/"+locator, nil, "application/octet-stream", s3ACL, s3.Options{})
+       err := v.bucket.Put("recent/"+locator, nil, "application/octet-stream", s3ACL, s3.Options{})
        if err != nil {
                panic(err)
        }
index d11bc05192246a75e8ba4c95bd544b0712279ff6..27d6216d01633feca360de94f0a8febaabfb475a 100644 (file)
@@ -4,6 +4,8 @@ import (
        "errors"
        "log"
        "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
 )
 
 // RunTrashWorker is used by Keepstore to initiate trash worker channel goroutine.
@@ -23,13 +25,13 @@ func RunTrashWorker(trashq *WorkQueue) {
 // TrashItem deletes the indicated block from every writable volume.
 func TrashItem(trashRequest TrashRequest) {
        reqMtime := time.Unix(0, trashRequest.BlockMtime)
-       if time.Since(reqMtime) < blobSignatureTTL {
+       if time.Since(reqMtime) < theConfig.BlobSignatureTTL.Duration() {
                log.Printf("WARNING: data manager asked to delete a %v old block %v (BlockMtime %d = %v), but my blobSignatureTTL is %v! Skipping.",
-                       time.Since(reqMtime),
+                       arvados.Duration(time.Since(reqMtime)),
                        trashRequest.Locator,
                        trashRequest.BlockMtime,
                        reqMtime,
-                       blobSignatureTTL)
+                       theConfig.BlobSignatureTTL)
                return
        }
 
@@ -44,8 +46,8 @@ func TrashItem(trashRequest TrashRequest) {
                        continue
                }
 
-               if neverDelete {
-                       err = errors.New("did not delete block because neverDelete is true")
+               if !theConfig.EnableDelete {
+                       err = errors.New("did not delete block because EnableDelete is false")
                } else {
                        err = volume.Trash(trashRequest.Locator)
                }
index 94798d95acfd85216ad60982b71282d84530ef7d..04b034a97976980c5ce66d59c361b44936dabbca 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "container/list"
+       "context"
        "testing"
        "time"
 )
@@ -31,7 +32,7 @@ type TrashWorkerTestData struct {
    Expect no errors.
 */
 func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: "5d41402abc4b2a76b9719d911017c592",
                Block1:   []byte("hello"),
@@ -53,7 +54,7 @@ func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) {
    Expect the second locator in volume 2 to be unaffected.
 */
 func TestTrashWorkerIntegration_LocatorInVolume1(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -75,7 +76,7 @@ func TestTrashWorkerIntegration_LocatorInVolume1(t *testing.T) {
    Expect the first locator in volume 1 to be unaffected.
 */
 func TestTrashWorkerIntegration_LocatorInVolume2(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -97,7 +98,7 @@ func TestTrashWorkerIntegration_LocatorInVolume2(t *testing.T) {
    Expect locator to be deleted from both volumes.
 */
 func TestTrashWorkerIntegration_LocatorInBothVolumes(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -119,7 +120,7 @@ func TestTrashWorkerIntegration_LocatorInBothVolumes(t *testing.T) {
    Delete the second and expect the first to be still around.
 */
 func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -143,7 +144,7 @@ func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *test
    Expect the other unaffected.
 */
 func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -166,7 +167,7 @@ func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) {
    will not be deleted because its Mtime is within the trash life time.
 */
 func TestTrashWorkerIntegration_SameLocatorInTwoVolumesWithDefaultTrashLifeTime(t *testing.T) {
-       neverDelete = false
+       theConfig.EnableDelete = true
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -188,11 +189,11 @@ func TestTrashWorkerIntegration_SameLocatorInTwoVolumesWithDefaultTrashLifeTime(
        performTrashWorkerTest(testData, t)
 }
 
-/* Delete a block with matching mtime for locator in both volumes, but neverDelete is true,
+/* Delete a block with matching mtime for locator in both volumes, but EnableDelete is false,
    so block won't be deleted.
 */
-func TestTrashWorkerIntegration_NeverDelete(t *testing.T) {
-       neverDelete = true
+func TestTrashWorkerIntegration_DisabledDelete(t *testing.T) {
+       theConfig.EnableDelete = false
        testData := TrashWorkerTestData{
                Locator1: TestHash,
                Block1:   TestBlock,
@@ -219,19 +220,19 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) {
        // Put test content
        vols := KeepVM.AllWritable()
        if testData.CreateData {
-               vols[0].Put(testData.Locator1, testData.Block1)
-               vols[0].Put(testData.Locator1+".meta", []byte("metadata"))
+               vols[0].Put(context.Background(), testData.Locator1, testData.Block1)
+               vols[0].Put(context.Background(), testData.Locator1+".meta", []byte("metadata"))
 
                if testData.CreateInVolume1 {
-                       vols[0].Put(testData.Locator2, testData.Block2)
-                       vols[0].Put(testData.Locator2+".meta", []byte("metadata"))
+                       vols[0].Put(context.Background(), testData.Locator2, testData.Block2)
+                       vols[0].Put(context.Background(), testData.Locator2+".meta", []byte("metadata"))
                } else {
-                       vols[1].Put(testData.Locator2, testData.Block2)
-                       vols[1].Put(testData.Locator2+".meta", []byte("metadata"))
+                       vols[1].Put(context.Background(), testData.Locator2, testData.Block2)
+                       vols[1].Put(context.Background(), testData.Locator2+".meta", []byte("metadata"))
                }
        }
 
-       oldBlockTime := time.Now().Add(-blobSignatureTTL - time.Minute)
+       oldBlockTime := time.Now().Add(-theConfig.BlobSignatureTTL.Duration() - time.Minute)
 
        // Create TrashRequest for the test
        trashRequest := TrashRequest{
@@ -291,7 +292,7 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) {
 
        // Verify Locator1 to be un/deleted as expected
        buf := make([]byte, BlockSize)
-       size, err := GetBlock(testData.Locator1, buf, nil)
+       size, err := GetBlock(context.Background(), testData.Locator1, buf, nil)
        if testData.ExpectLocator1 {
                if size == 0 || err != nil {
                        t.Errorf("Expected Locator1 to be still present: %s", testData.Locator1)
@@ -304,7 +305,7 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) {
 
        // Verify Locator2 to be un/deleted as expected
        if testData.Locator1 != testData.Locator2 {
-               size, err = GetBlock(testData.Locator2, buf, nil)
+               size, err = GetBlock(context.Background(), testData.Locator2, buf, nil)
                if testData.ExpectLocator2 {
                        if size == 0 || err != nil {
                                t.Errorf("Expected Locator2 to be still present: %s", testData.Locator2)
@@ -323,7 +324,7 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) {
                locatorFoundIn := 0
                for _, volume := range KeepVM.AllReadable() {
                        buf := make([]byte, BlockSize)
-                       if _, err := volume.Get(testData.Locator1, buf); err == nil {
+                       if _, err := volume.Get(context.Background(), testData.Locator1, buf); err == nil {
                                locatorFoundIn = locatorFoundIn + 1
                        }
                }
diff --git a/services/keepstore/usage.go b/services/keepstore/usage.go
new file mode 100644 (file)
index 0000000..29f89f5
--- /dev/null
@@ -0,0 +1,124 @@
+package main
+
+import (
+       "flag"
+       "fmt"
+       "os"
+       "sort"
+       "strings"
+
+       "github.com/ghodss/yaml"
+)
+
+func usage() {
+       c := DefaultConfig()
+       knownTypes := []string{}
+       for _, vt := range VolumeTypes {
+               c.Volumes = append(c.Volumes, vt().Examples()...)
+               knownTypes = append(knownTypes, vt().Type())
+       }
+       exampleConfigFile, err := yaml.Marshal(c)
+       if err != nil {
+               panic(err)
+       }
+       sort.Strings(knownTypes)
+       knownTypeList := strings.Join(knownTypes, ", ")
+       fmt.Fprintf(os.Stderr, `
+
+keepstore provides a content-addressed data store backed by a local filesystem or networked storage.
+
+Usage: keepstore -config path/to/keepstore.yml
+       keepstore [OPTIONS] -dump-config
+
+NOTE: All options (other than -config) are deprecated in favor of YAML
+      configuration. Use -dump-config to translate existing
+      configurations to YAML format.
+
+Options:
+`)
+       flag.PrintDefaults()
+       fmt.Fprintf(os.Stderr, `
+Example config file:
+
+%s
+
+Listen:
+
+    Local port to listen on. Can be "address:port" or ":port", where
+    "address" is a host IP address or name and "port" is a port number
+    or name.
+
+PIDFile:
+
+   Path to write PID file during startup. This file is kept open and
+   locked with LOCK_EX until keepstore exits, so "fuser -k pidfile" is
+   one way to shut down. Exit immediately if there is an error
+   opening, locking, or writing the PID file.
+
+MaxBuffers:
+
+    Maximum RAM to use for data buffers, given in multiples of block
+    size (64 MiB). When this limit is reached, HTTP requests requiring
+    buffers (like GET and PUT) will wait for buffer space to be
+    released.
+
+MaxRequests:
+
+    Maximum concurrent requests. When this limit is reached, new
+    requests will receive 503 responses. Note: this limit does not
+    include idle connections from clients using HTTP keepalive, so it
+    does not strictly limit the number of concurrent connections. If
+    omitted or zero, the default is 2 * MaxBuffers.
+
+BlobSigningKeyFile:
+
+    Local file containing the secret blob signing key (used to
+    generate and verify blob signatures).  This key should be
+    identical to the API server's blob_signing_key configuration
+    entry.
+
+RequireSignatures:
+
+    Honor read requests only if a valid signature is provided.  This
+    should be true, except for development use and when migrating from
+    a very old version.
+
+BlobSignatureTTL:
+
+    Duration for which new permission signatures (returned in PUT
+    responses) will be valid.  This should be equal to the API
+    server's blob_signature_ttl configuration entry.
+
+SystemAuthTokenFile:
+
+    Local file containing the Arvados API token used by keep-balance
+    or data manager.  Delete, trash, and index requests are honored
+    only for this token.
+
+EnableDelete:
+
+    Enable trash and delete features. If false, trash lists will be
+    accepted but blocks will not be trashed or deleted.
+
+TrashLifetime:
+
+    Time duration after a block is trashed during which it can be
+    recovered using an /untrash request.
+
+TrashCheckInterval:
+
+    How often to check for (and delete) trashed blocks whose
+    TrashLifetime has expired.
+
+Volumes:
+
+    List of storage volumes. If omitted or empty, the default is to
+    use all directories named "keep" that exist in the top level
+    directory of a mount point at startup time.
+
+    Volume types: %s
+
+    (See volume configuration examples above.)
+
+`, exampleConfigFile, knownTypeList)
+}
index 8ae6660fd477fa90365a019c837a121a08cc9595..b72258d51a5e6358c190227db08d5bf8c419dfe4 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "context"
        "io"
        "sync/atomic"
        "time"
@@ -10,6 +11,15 @@ import (
 // for example, a single mounted disk, a RAID array, an Amazon S3 volume,
 // etc.
 type Volume interface {
+       // Volume type as specified in config file. Examples: "S3",
+       // "Directory".
+       Type() string
+
+       // Do whatever private setup tasks and configuration checks
+       // are needed. Return non-nil if the volume is unusable (e.g.,
+       // invalid config).
+       Start() error
+
        // Get a block: copy the block data into buf, and return the
        // number of bytes copied.
        //
@@ -38,14 +48,14 @@ type Volume interface {
        // any of the data.
        //
        // len(buf) will not exceed BlockSize.
-       Get(loc string, buf []byte) (int, error)
+       Get(ctx context.Context, loc string, buf []byte) (int, error)
 
        // Compare the given data with the stored data (i.e., what Get
        // would return). If equal, return nil. If not, return
        // CollisionError or DiskHashError (depending on whether the
        // data on disk matches the expected hash), or whatever error
        // was encountered opening/reading the stored data.
-       Compare(loc string, data []byte) error
+       Compare(ctx context.Context, loc string, data []byte) error
 
        // Put writes a block to an underlying storage device.
        //
@@ -75,7 +85,7 @@ type Volume interface {
        //
        // Put should not verify that loc==hash(block): this is the
        // caller's responsibility.
-       Put(loc string, block []byte) error
+       Put(ctx context.Context, loc string, block []byte) error
 
        // Touch sets the timestamp for the given locator to the
        // current time.
@@ -150,7 +160,7 @@ type Volume interface {
        // loc is as described in Get.
        //
        // If the timestamp for the given locator is newer than
-       // blobSignatureTTL, Trash must not trash the data.
+       // BlobSignatureTTL, Trash must not trash the data.
        //
        // If a Trash operation overlaps with any Touch or Put
        // operations on the same locator, the implementation must
@@ -171,7 +181,7 @@ type Volume interface {
        // reliably or fail outright.
        //
        // Corollary: A successful Touch or Put guarantees a block
-       // will not be trashed for at least blobSignatureTTL
+       // will not be trashed for at least BlobSignatureTTL
        // seconds.
        Trash(loc string) error
 
@@ -204,11 +214,18 @@ type Volume interface {
        // responses to PUT requests.
        Replication() int
 
-       // EmptyTrash looks for trashed blocks that exceeded trashLifetime
+       // EmptyTrash looks for trashed blocks that exceeded TrashLifetime
        // and deletes them from the volume.
        EmptyTrash()
 }
 
+// A VolumeWithExamples provides example configs to display in the
+// -help message.
+type VolumeWithExamples interface {
+       Volume
+       Examples() []Volume
+}
+
 // A VolumeManager tells callers which volumes can read, which volumes
 // can write, and on which volume the next write should be attempted.
 type VolumeManager interface {
@@ -226,6 +243,10 @@ type VolumeManager interface {
        // with more free space, etc.
        NextWritable() Volume
 
+       // VolumeStats returns the ioStats used for tracking stats for
+       // the given Volume.
+       VolumeStats(Volume) *ioStats
+
        // Close shuts down the volume manager cleanly.
        Close()
 }
@@ -237,12 +258,16 @@ type RRVolumeManager struct {
        readables []Volume
        writables []Volume
        counter   uint32
+       iostats   map[Volume]*ioStats
 }
 
 // MakeRRVolumeManager initializes RRVolumeManager
 func MakeRRVolumeManager(volumes []Volume) *RRVolumeManager {
-       vm := &RRVolumeManager{}
+       vm := &RRVolumeManager{
+               iostats: make(map[Volume]*ioStats),
+       }
        for _, v := range volumes {
+               vm.iostats[v] = &ioStats{}
                vm.readables = append(vm.readables, v)
                if v.Writable() {
                        vm.writables = append(vm.writables, v)
@@ -270,18 +295,35 @@ func (vm *RRVolumeManager) NextWritable() Volume {
        return vm.writables[i%uint32(len(vm.writables))]
 }
 
+// VolumeStats returns an ioStats for the given volume.
+func (vm *RRVolumeManager) VolumeStats(v Volume) *ioStats {
+       return vm.iostats[v]
+}
+
 // Close the RRVolumeManager
 func (vm *RRVolumeManager) Close() {
 }
 
-// VolumeStatus provides status information of the volume consisting of:
-//   * mount_point
-//   * device_num (an integer identifying the underlying storage system)
-//   * bytes_free
-//   * bytes_used
+// VolumeStatus describes the current condition of a volume
 type VolumeStatus struct {
-       MountPoint string `json:"mount_point"`
-       DeviceNum  uint64 `json:"device_num"`
-       BytesFree  uint64 `json:"bytes_free"`
-       BytesUsed  uint64 `json:"bytes_used"`
+       MountPoint string
+       DeviceNum  uint64
+       BytesFree  uint64
+       BytesUsed  uint64
+}
+
+// ioStats tracks I/O statistics for a volume or server
+type ioStats struct {
+       Errors     uint64
+       Ops        uint64
+       CompareOps uint64
+       GetOps     uint64
+       PutOps     uint64
+       TouchOps   uint64
+       InBytes    uint64
+       OutBytes   uint64
+}
+
+type InternalStatser interface {
+       InternalStats() interface{}
 }
index bc3e537a89a815037102af7fb920e8b9d2b84f61..7e72a8f246ee60410e7110417de3284ae4263ca3 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "crypto/md5"
        "fmt"
        "os"
@@ -11,6 +12,7 @@ import (
        "strings"
        "time"
 
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
        "git.curoverse.com/arvados.git/sdk/go/arvadostest"
 )
 
@@ -91,7 +93,7 @@ func testGet(t TB, factory TestableVolumeFactory) {
        v.PutRaw(TestHash, TestBlock)
 
        buf := make([]byte, BlockSize)
-       n, err := v.Get(TestHash, buf)
+       n, err := v.Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Fatal(err)
        }
@@ -108,7 +110,7 @@ func testGetNoSuchBlock(t TB, factory TestableVolumeFactory) {
        defer v.Teardown()
 
        buf := make([]byte, BlockSize)
-       if _, err := v.Get(TestHash2, buf); err == nil {
+       if _, err := v.Get(context.Background(), TestHash2, buf); err == nil {
                t.Errorf("Expected error while getting non-existing block %v", TestHash2)
        }
 }
@@ -120,7 +122,7 @@ func testCompareNonexistent(t TB, factory TestableVolumeFactory) {
        v := factory(t)
        defer v.Teardown()
 
-       err := v.Compare(TestHash, TestBlock)
+       err := v.Compare(context.Background(), TestHash, TestBlock)
        if err != os.ErrNotExist {
                t.Errorf("Got err %T %q, expected os.ErrNotExist", err, err)
        }
@@ -135,7 +137,7 @@ func testCompareSameContent(t TB, factory TestableVolumeFactory, testHash string
        v.PutRaw(testHash, testData)
 
        // Compare the block locator with same content
-       err := v.Compare(testHash, testData)
+       err := v.Compare(context.Background(), testHash, testData)
        if err != nil {
                t.Errorf("Got err %q, expected nil", err)
        }
@@ -153,7 +155,7 @@ func testCompareWithCollision(t TB, factory TestableVolumeFactory, testHash stri
        v.PutRaw(testHash, testDataA)
 
        // Compare the block locator with different content; collision
-       err := v.Compare(TestHash, testDataB)
+       err := v.Compare(context.Background(), TestHash, testDataB)
        if err == nil {
                t.Errorf("Got err nil, expected error due to collision")
        }
@@ -169,7 +171,7 @@ func testCompareWithCorruptStoredData(t TB, factory TestableVolumeFactory, testH
 
        v.PutRaw(TestHash, testDataB)
 
-       err := v.Compare(testHash, testDataA)
+       err := v.Compare(context.Background(), testHash, testDataA)
        if err == nil || err == CollisionError {
                t.Errorf("Got err %+v, expected non-collision error", err)
        }
@@ -185,12 +187,12 @@ func testPutBlockWithSameContent(t TB, factory TestableVolumeFactory, testHash s
                return
        }
 
-       err := v.Put(testHash, testData)
+       err := v.Put(context.Background(), testHash, testData)
        if err != nil {
                t.Errorf("Got err putting block %q: %q, expected nil", TestBlock, err)
        }
 
-       err = v.Put(testHash, testData)
+       err = v.Put(context.Background(), testHash, testData)
        if err != nil {
                t.Errorf("Got err putting block second time %q: %q, expected nil", TestBlock, err)
        }
@@ -208,9 +210,9 @@ func testPutBlockWithDifferentContent(t TB, factory TestableVolumeFactory, testH
 
        v.PutRaw(testHash, testDataA)
 
-       putErr := v.Put(testHash, testDataB)
+       putErr := v.Put(context.Background(), testHash, testDataB)
        buf := make([]byte, BlockSize)
-       n, getErr := v.Get(testHash, buf)
+       n, getErr := v.Get(context.Background(), testHash, buf)
        if putErr == nil {
                // Put must not return a nil error unless it has
                // overwritten the existing data.
@@ -237,23 +239,23 @@ func testPutMultipleBlocks(t TB, factory TestableVolumeFactory) {
                return
        }
 
-       err := v.Put(TestHash, TestBlock)
+       err := v.Put(context.Background(), TestHash, TestBlock)
        if err != nil {
                t.Errorf("Got err putting block %q: %q, expected nil", TestBlock, err)
        }
 
-       err = v.Put(TestHash2, TestBlock2)
+       err = v.Put(context.Background(), TestHash2, TestBlock2)
        if err != nil {
                t.Errorf("Got err putting block %q: %q, expected nil", TestBlock2, err)
        }
 
-       err = v.Put(TestHash3, TestBlock3)
+       err = v.Put(context.Background(), TestHash3, TestBlock3)
        if err != nil {
                t.Errorf("Got err putting block %q: %q, expected nil", TestBlock3, err)
        }
 
        data := make([]byte, BlockSize)
-       n, err := v.Get(TestHash, data)
+       n, err := v.Get(context.Background(), TestHash, data)
        if err != nil {
                t.Error(err)
        } else {
@@ -262,7 +264,7 @@ func testPutMultipleBlocks(t TB, factory TestableVolumeFactory) {
                }
        }
 
-       n, err = v.Get(TestHash2, data)
+       n, err = v.Get(context.Background(), TestHash2, data)
        if err != nil {
                t.Error(err)
        } else {
@@ -271,7 +273,7 @@ func testPutMultipleBlocks(t TB, factory TestableVolumeFactory) {
                }
        }
 
-       n, err = v.Get(TestHash3, data)
+       n, err = v.Get(context.Background(), TestHash3, data)
        if err != nil {
                t.Error(err)
        } else {
@@ -293,7 +295,7 @@ func testPutAndTouch(t TB, factory TestableVolumeFactory) {
                return
        }
 
-       if err := v.Put(TestHash, TestBlock); err != nil {
+       if err := v.Put(context.Background(), TestHash, TestBlock); err != nil {
                t.Error(err)
        }
 
@@ -313,7 +315,7 @@ func testPutAndTouch(t TB, factory TestableVolumeFactory) {
        }
 
        // Write the same block again.
-       if err := v.Put(TestHash, TestBlock); err != nil {
+       if err := v.Put(context.Background(), TestHash, TestBlock); err != nil {
                t.Error(err)
        }
 
@@ -430,19 +432,19 @@ func testIndexTo(t TB, factory TestableVolumeFactory) {
 func testDeleteNewBlock(t TB, factory TestableVolumeFactory) {
        v := factory(t)
        defer v.Teardown()
-       blobSignatureTTL = 300 * time.Second
+       theConfig.BlobSignatureTTL.Set("5m")
 
        if v.Writable() == false {
                return
        }
 
-       v.Put(TestHash, TestBlock)
+       v.Put(context.Background(), TestHash, TestBlock)
 
        if err := v.Trash(TestHash); err != nil {
                t.Error(err)
        }
        data := make([]byte, BlockSize)
-       n, err := v.Get(TestHash, data)
+       n, err := v.Get(context.Background(), TestHash, data)
        if err != nil {
                t.Error(err)
        } else if bytes.Compare(data[:n], TestBlock) != 0 {
@@ -451,25 +453,25 @@ func testDeleteNewBlock(t TB, factory TestableVolumeFactory) {
 }
 
 // Calling Delete() for a block with a timestamp older than
-// blobSignatureTTL seconds in the past should delete the data.
+// BlobSignatureTTL seconds in the past should delete the data.
 // Test is intended for only writable volumes
 func testDeleteOldBlock(t TB, factory TestableVolumeFactory) {
        v := factory(t)
        defer v.Teardown()
-       blobSignatureTTL = 300 * time.Second
+       theConfig.BlobSignatureTTL.Set("5m")
 
        if v.Writable() == false {
                return
        }
 
-       v.Put(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.Put(context.Background(), TestHash, TestBlock)
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
        if err := v.Trash(TestHash); err != nil {
                t.Error(err)
        }
        data := make([]byte, BlockSize)
-       if _, err := v.Get(TestHash, data); err == nil || !os.IsNotExist(err) {
+       if _, err := v.Get(context.Background(), TestHash, data); err == nil || !os.IsNotExist(err) {
                t.Errorf("os.IsNotExist(%v) should have been true", err)
        }
 
@@ -478,7 +480,7 @@ func testDeleteOldBlock(t TB, factory TestableVolumeFactory) {
                t.Fatalf("os.IsNotExist(%v) should have been true", err)
        }
 
-       err = v.Compare(TestHash, TestBlock)
+       err = v.Compare(context.Background(), TestHash, TestBlock)
        if err == nil || !os.IsNotExist(err) {
                t.Fatalf("os.IsNotExist(%v) should have been true", err)
        }
@@ -552,17 +554,17 @@ func testUpdateReadOnly(t TB, factory TestableVolumeFactory) {
        buf := make([]byte, BlockSize)
 
        // Get from read-only volume should succeed
-       _, err := v.Get(TestHash, buf)
+       _, err := v.Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Errorf("got err %v, expected nil", err)
        }
 
        // Put a new block to read-only volume should result in error
-       err = v.Put(TestHash2, TestBlock2)
+       err = v.Put(context.Background(), TestHash2, TestBlock2)
        if err == nil {
                t.Errorf("Expected error when putting block in a read-only volume")
        }
-       _, err = v.Get(TestHash2, buf)
+       _, err = v.Get(context.Background(), TestHash2, buf)
        if err == nil {
                t.Errorf("Expected error when getting block whose put in read-only volume failed")
        }
@@ -580,7 +582,7 @@ func testUpdateReadOnly(t TB, factory TestableVolumeFactory) {
        }
 
        // Overwriting an existing block in read-only volume should result in error
-       err = v.Put(TestHash, TestBlock)
+       err = v.Put(context.Background(), TestHash, TestBlock)
        if err == nil {
                t.Errorf("Expected error when putting block in a read-only volume")
        }
@@ -599,7 +601,7 @@ func testGetConcurrent(t TB, factory TestableVolumeFactory) {
        sem := make(chan int)
        go func() {
                buf := make([]byte, BlockSize)
-               n, err := v.Get(TestHash, buf)
+               n, err := v.Get(context.Background(), TestHash, buf)
                if err != nil {
                        t.Errorf("err1: %v", err)
                }
@@ -611,7 +613,7 @@ func testGetConcurrent(t TB, factory TestableVolumeFactory) {
 
        go func() {
                buf := make([]byte, BlockSize)
-               n, err := v.Get(TestHash2, buf)
+               n, err := v.Get(context.Background(), TestHash2, buf)
                if err != nil {
                        t.Errorf("err2: %v", err)
                }
@@ -623,7 +625,7 @@ func testGetConcurrent(t TB, factory TestableVolumeFactory) {
 
        go func() {
                buf := make([]byte, BlockSize)
-               n, err := v.Get(TestHash3, buf)
+               n, err := v.Get(context.Background(), TestHash3, buf)
                if err != nil {
                        t.Errorf("err3: %v", err)
                }
@@ -651,7 +653,7 @@ func testPutConcurrent(t TB, factory TestableVolumeFactory) {
 
        sem := make(chan int)
        go func(sem chan int) {
-               err := v.Put(TestHash, TestBlock)
+               err := v.Put(context.Background(), TestHash, TestBlock)
                if err != nil {
                        t.Errorf("err1: %v", err)
                }
@@ -659,7 +661,7 @@ func testPutConcurrent(t TB, factory TestableVolumeFactory) {
        }(sem)
 
        go func(sem chan int) {
-               err := v.Put(TestHash2, TestBlock2)
+               err := v.Put(context.Background(), TestHash2, TestBlock2)
                if err != nil {
                        t.Errorf("err2: %v", err)
                }
@@ -667,7 +669,7 @@ func testPutConcurrent(t TB, factory TestableVolumeFactory) {
        }(sem)
 
        go func(sem chan int) {
-               err := v.Put(TestHash3, TestBlock3)
+               err := v.Put(context.Background(), TestHash3, TestBlock3)
                if err != nil {
                        t.Errorf("err3: %v", err)
                }
@@ -681,7 +683,7 @@ func testPutConcurrent(t TB, factory TestableVolumeFactory) {
 
        // Double check that we actually wrote the blocks we expected to write.
        buf := make([]byte, BlockSize)
-       n, err := v.Get(TestHash, buf)
+       n, err := v.Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Errorf("Get #1: %v", err)
        }
@@ -689,7 +691,7 @@ func testPutConcurrent(t TB, factory TestableVolumeFactory) {
                t.Errorf("Get #1: expected %s, got %s", string(TestBlock), string(buf[:n]))
        }
 
-       n, err = v.Get(TestHash2, buf)
+       n, err = v.Get(context.Background(), TestHash2, buf)
        if err != nil {
                t.Errorf("Get #2: %v", err)
        }
@@ -697,7 +699,7 @@ func testPutConcurrent(t TB, factory TestableVolumeFactory) {
                t.Errorf("Get #2: expected %s, got %s", string(TestBlock2), string(buf[:n]))
        }
 
-       n, err = v.Get(TestHash3, buf)
+       n, err = v.Get(context.Background(), TestHash3, buf)
        if err != nil {
                t.Errorf("Get #3: %v", err)
        }
@@ -719,12 +721,12 @@ func testPutFullBlock(t TB, factory TestableVolumeFactory) {
        wdata[0] = 'a'
        wdata[BlockSize-1] = 'z'
        hash := fmt.Sprintf("%x", md5.Sum(wdata))
-       err := v.Put(hash, wdata)
+       err := v.Put(context.Background(), hash, wdata)
        if err != nil {
                t.Fatal(err)
        }
        buf := make([]byte, BlockSize)
-       n, err := v.Get(hash, buf)
+       n, err := v.Get(context.Background(), hash, buf)
        if err != nil {
                t.Error(err)
        }
@@ -733,7 +735,7 @@ func testPutFullBlock(t TB, factory TestableVolumeFactory) {
        }
 }
 
-// With trashLifetime != 0, perform:
+// With TrashLifetime != 0, perform:
 // Trash an old block - which either raises ErrNotImplemented or succeeds
 // Untrash -  which either raises ErrNotImplemented or succeeds
 // Get - which must succeed
@@ -741,17 +743,17 @@ func testTrashUntrash(t TB, factory TestableVolumeFactory) {
        v := factory(t)
        defer v.Teardown()
        defer func() {
-               trashLifetime = 0
+               theConfig.TrashLifetime = 0
        }()
 
-       trashLifetime = 3600 * time.Second
+       theConfig.TrashLifetime.Set("1h")
 
        // put block and backdate it
        v.PutRaw(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
        buf := make([]byte, BlockSize)
-       n, err := v.Get(TestHash, buf)
+       n, err := v.Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Fatal(err)
        }
@@ -770,7 +772,7 @@ func testTrashUntrash(t TB, factory TestableVolumeFactory) {
                        t.Fatal(err)
                }
        } else {
-               _, err = v.Get(TestHash, buf)
+               _, err = v.Get(context.Background(), TestHash, buf)
                if err == nil || !os.IsNotExist(err) {
                        t.Errorf("os.IsNotExist(%v) should have been true", err)
                }
@@ -783,7 +785,7 @@ func testTrashUntrash(t TB, factory TestableVolumeFactory) {
        }
 
        // Get the block - after trash and untrash sequence
-       n, err = v.Get(TestHash, buf)
+       n, err = v.Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Fatal(err)
        }
@@ -795,13 +797,13 @@ func testTrashUntrash(t TB, factory TestableVolumeFactory) {
 func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        v := factory(t)
        defer v.Teardown()
-       defer func(orig time.Duration) {
-               trashLifetime = orig
-       }(trashLifetime)
+       defer func(orig arvados.Duration) {
+               theConfig.TrashLifetime = orig
+       }(theConfig.TrashLifetime)
 
        checkGet := func() error {
                buf := make([]byte, BlockSize)
-               n, err := v.Get(TestHash, buf)
+               n, err := v.Get(context.Background(), TestHash, buf)
                if err != nil {
                        return err
                }
@@ -814,7 +816,7 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
                        return err
                }
 
-               err = v.Compare(TestHash, TestBlock)
+               err = v.Compare(context.Background(), TestHash, TestBlock)
                if err != nil {
                        return err
                }
@@ -830,10 +832,10 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
 
        // First set: EmptyTrash before reaching the trash deadline.
 
-       trashLifetime = time.Hour
+       theConfig.TrashLifetime.Set("1h")
 
        v.PutRaw(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
        err := checkGet()
        if err != nil {
@@ -844,7 +846,7 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        err = v.Trash(TestHash)
        if err == MethodDisabledError || err == ErrNotImplemented {
                // Skip the trash tests for read-only volumes, and
-               // volume types that don't support trashLifetime>0.
+               // volume types that don't support TrashLifetime>0.
                return
        }
 
@@ -878,7 +880,7 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        }
 
        // Because we Touch'ed, need to backdate again for next set of tests
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
        // If the only block in the trash has already been untrashed,
        // most volumes will fail a subsequent Untrash with a 404, but
@@ -896,11 +898,11 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        }
 
        // Untrash might have updated the timestamp, so backdate again
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
        // Second set: EmptyTrash after the trash deadline has passed.
 
-       trashLifetime = time.Nanosecond
+       theConfig.TrashLifetime.Set("1ns")
 
        err = v.Trash(TestHash)
        if err != nil {
@@ -925,7 +927,7 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        // Trash it again, and this time call EmptyTrash so it really
        // goes away.
        // (In Azure volumes, un/trash changes Mtime, so first backdate again)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
        err = v.Trash(TestHash)
        err = checkGet()
        if err == nil || !os.IsNotExist(err) {
@@ -950,9 +952,9 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        // un-trashed copy doesn't get deleted along with it.
 
        v.PutRaw(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
-       trashLifetime = time.Nanosecond
+       theConfig.TrashLifetime.Set("1ns")
        err = v.Trash(TestHash)
        if err != nil {
                t.Fatal(err)
@@ -963,7 +965,7 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        }
 
        v.PutRaw(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
        // EmptyTrash should not delete the untrashed copy.
        v.EmptyTrash()
@@ -978,18 +980,18 @@ func testTrashEmptyTrashUntrash(t TB, factory TestableVolumeFactory) {
        // untrash the block whose deadline is "C".
 
        v.PutRaw(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
-       trashLifetime = time.Nanosecond
+       theConfig.TrashLifetime.Set("1ns")
        err = v.Trash(TestHash)
        if err != nil {
                t.Fatal(err)
        }
 
        v.PutRaw(TestHash, TestBlock)
-       v.TouchWithDate(TestHash, time.Now().Add(-2*blobSignatureTTL))
+       v.TouchWithDate(TestHash, time.Now().Add(-2*theConfig.BlobSignatureTTL.Duration()))
 
-       trashLifetime = time.Hour
+       theConfig.TrashLifetime.Set("1h")
        err = v.Trash(TestHash)
        if err != nil {
                t.Fatal(err)
index 5671b8d4a9fd7405f8ca7fd35a18fdf10289a059..931c10e69044c4715eb35ccab4d33872a848db5d 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "crypto/md5"
        "errors"
        "fmt"
@@ -95,7 +96,7 @@ func (v *MockVolume) gotCall(method string) {
        }
 }
 
-func (v *MockVolume) Compare(loc string, buf []byte) error {
+func (v *MockVolume) Compare(ctx context.Context, loc string, buf []byte) error {
        v.gotCall("Compare")
        <-v.Gate
        if v.Bad {
@@ -113,7 +114,7 @@ func (v *MockVolume) Compare(loc string, buf []byte) error {
        }
 }
 
-func (v *MockVolume) Get(loc string, buf []byte) (int, error) {
+func (v *MockVolume) Get(ctx context.Context, loc string, buf []byte) (int, error) {
        v.gotCall("Get")
        <-v.Gate
        if v.Bad {
@@ -125,7 +126,7 @@ func (v *MockVolume) Get(loc string, buf []byte) (int, error) {
        return 0, os.ErrNotExist
 }
 
-func (v *MockVolume) Put(loc string, block []byte) error {
+func (v *MockVolume) Put(ctx context.Context, loc string, block []byte) error {
        v.gotCall("Put")
        <-v.Gate
        if v.Bad {
@@ -189,7 +190,7 @@ func (v *MockVolume) Trash(loc string) error {
                return MethodDisabledError
        }
        if _, ok := v.Store[loc]; ok {
-               if time.Since(v.Timestamps[loc]) < blobSignatureTTL {
+               if time.Since(v.Timestamps[loc]) < time.Duration(theConfig.BlobSignatureTTL) {
                        return nil
                }
                delete(v.Store, loc)
@@ -198,7 +199,14 @@ func (v *MockVolume) Trash(loc string) error {
        return os.ErrNotExist
 }
 
-// TBD
+func (v *MockVolume) Type() string {
+       return "Mock"
+}
+
+func (v *MockVolume) Start() error {
+       return nil
+}
+
 func (v *MockVolume) Untrash(loc string) error {
        return nil
 }
index 5982fb0484eae0a37ef09e24b9526492c5b0459f..f9812b07cd8630ae75f2a8e32feddd7b2d099a43 100644 (file)
@@ -2,7 +2,7 @@ package main
 
 import (
        "bufio"
-       "errors"
+       "context"
        "flag"
        "fmt"
        "io"
@@ -19,11 +19,16 @@ import (
 )
 
 type unixVolumeAdder struct {
-       *volumeSet
+       *Config
 }
 
-func (vs *unixVolumeAdder) Set(value string) error {
-       if dirs := strings.Split(value, ","); len(dirs) > 1 {
+// String implements flag.Value
+func (s *unixVolumeAdder) String() string {
+       return "-"
+}
+
+func (vs *unixVolumeAdder) Set(path string) error {
+       if dirs := strings.Split(path, ","); len(dirs) > 1 {
                log.Print("DEPRECATED: using comma-separated volume list.")
                for _, dir := range dirs {
                        if err := vs.Set(dir); err != nil {
@@ -32,33 +37,19 @@ func (vs *unixVolumeAdder) Set(value string) error {
                }
                return nil
        }
-       if len(value) == 0 || value[0] != '/' {
-               return errors.New("Invalid volume: must begin with '/'.")
-       }
-       if _, err := os.Stat(value); err != nil {
-               return err
-       }
-       var locker sync.Locker
-       if flagSerializeIO {
-               locker = &sync.Mutex{}
-       }
-       *vs.volumeSet = append(*vs.volumeSet, &UnixVolume{
-               root:     value,
-               locker:   locker,
-               readonly: flagReadonly,
+       vs.Config.Volumes = append(vs.Config.Volumes, &UnixVolume{
+               Root:      path,
+               ReadOnly:  deprecated.flagReadonly,
+               Serialize: deprecated.flagSerializeIO,
        })
        return nil
 }
 
 func init() {
-       flag.Var(
-               &unixVolumeAdder{&volumes},
-               "volumes",
-               "Deprecated synonym for -volume.")
-       flag.Var(
-               &unixVolumeAdder{&volumes},
-               "volume",
-               "Local storage directory. Can be given more than once to add multiple directories. If none are supplied, the default is to use all directories named \"keep\" that exist in the top level directory of a mount point at startup time. Can be a comma-separated list, but this is deprecated: use multiple -volume arguments instead.")
+       VolumeTypes = append(VolumeTypes, func() VolumeWithExamples { return &UnixVolume{} })
+
+       flag.Var(&unixVolumeAdder{theConfig}, "volumes", "see Volumes configuration")
+       flag.Var(&unixVolumeAdder{theConfig}, "volume", "see Volumes configuration")
 }
 
 // Discover adds a UnixVolume for every directory named "keep" that is
@@ -89,10 +80,10 @@ func (vs *unixVolumeAdder) Discover() int {
                }
                // Set the -readonly flag (but only for this volume)
                // if the filesystem is mounted readonly.
-               flagReadonlyWas := flagReadonly
+               flagReadonlyWas := deprecated.flagReadonly
                for _, fsopt := range strings.Split(args[3], ",") {
                        if fsopt == "ro" {
-                               flagReadonly = true
+                               deprecated.flagReadonly = true
                                break
                        }
                        if fsopt == "rw" {
@@ -104,24 +95,62 @@ func (vs *unixVolumeAdder) Discover() int {
                } else {
                        added++
                }
-               flagReadonly = flagReadonlyWas
+               deprecated.flagReadonly = flagReadonlyWas
        }
        return added
 }
 
 // A UnixVolume stores and retrieves blocks in a local directory.
 type UnixVolume struct {
-       // path to the volume's root directory
-       root string
+       Root                 string // path to the volume's root directory
+       ReadOnly             bool
+       Serialize            bool
+       DirectoryReplication int
+
        // something to lock during IO, typically a sync.Mutex (or nil
        // to skip locking)
-       locker   sync.Locker
-       readonly bool
+       locker sync.Locker
+}
+
+// Examples implements VolumeWithExamples.
+func (*UnixVolume) Examples() []Volume {
+       return []Volume{
+               &UnixVolume{
+                       Root:                 "/mnt/local-disk",
+                       Serialize:            true,
+                       DirectoryReplication: 1,
+               },
+               &UnixVolume{
+                       Root:                 "/mnt/network-disk",
+                       Serialize:            false,
+                       DirectoryReplication: 2,
+               },
+       }
+}
+
+// Type implements Volume
+func (v *UnixVolume) Type() string {
+       return "Directory"
+}
+
+// Start implements Volume
+func (v *UnixVolume) Start() error {
+       if v.Serialize {
+               v.locker = &sync.Mutex{}
+       }
+       if !strings.HasPrefix(v.Root, "/") {
+               return fmt.Errorf("volume root does not start with '/': %q", v.Root)
+       }
+       if v.DirectoryReplication == 0 {
+               v.DirectoryReplication = 1
+       }
+       _, err := os.Stat(v.Root)
+       return err
 }
 
 // Touch sets the timestamp for the given locator to the current time
 func (v *UnixVolume) Touch(loc string) error {
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
        p := v.blockPath(loc)
@@ -154,11 +183,14 @@ func (v *UnixVolume) Mtime(loc string) (time.Time, error) {
 
 // Lock the locker (if one is in use), open the file for reading, and
 // call the given function if and when the file is ready to read.
-func (v *UnixVolume) getFunc(path string, fn func(io.Reader) error) error {
+func (v *UnixVolume) getFunc(ctx context.Context, path string, fn func(io.Reader) error) error {
        if v.locker != nil {
                v.locker.Lock()
                defer v.locker.Unlock()
        }
+       if ctx.Err() != nil {
+               return ctx.Err()
+       }
        f, err := os.Open(path)
        if err != nil {
                return err
@@ -182,7 +214,7 @@ func (v *UnixVolume) stat(path string) (os.FileInfo, error) {
 
 // Get retrieves a block, copies it to the given slice, and returns
 // the number of bytes copied.
-func (v *UnixVolume) Get(loc string, buf []byte) (int, error) {
+func (v *UnixVolume) Get(ctx context.Context, loc string, buf []byte) (int, error) {
        path := v.blockPath(loc)
        stat, err := v.stat(path)
        if err != nil {
@@ -193,7 +225,7 @@ func (v *UnixVolume) Get(loc string, buf []byte) (int, error) {
        }
        var read int
        size := int(stat.Size())
-       err = v.getFunc(path, func(rdr io.Reader) error {
+       err = v.getFunc(ctx, path, func(rdr io.Reader) error {
                read, err = io.ReadFull(rdr, buf[:size])
                return err
        })
@@ -203,13 +235,13 @@ func (v *UnixVolume) Get(loc string, buf []byte) (int, error) {
 // Compare returns nil if Get(loc) would return the same content as
 // expect. It is functionally equivalent to Get() followed by
 // bytes.Compare(), but uses less memory.
-func (v *UnixVolume) Compare(loc string, expect []byte) error {
+func (v *UnixVolume) Compare(ctx context.Context, loc string, expect []byte) error {
        path := v.blockPath(loc)
        if _, err := v.stat(path); err != nil {
                return v.translateError(err)
        }
-       return v.getFunc(path, func(rdr io.Reader) error {
-               return compareReaderWithBuf(rdr, expect, loc[:32])
+       return v.getFunc(ctx, path, func(rdr io.Reader) error {
+               return compareReaderWithBuf(ctx, rdr, expect, loc[:32])
        })
 }
 
@@ -217,8 +249,8 @@ func (v *UnixVolume) Compare(loc string, expect []byte) error {
 // "loc".  It returns nil on success.  If the volume is full, it
 // returns a FullError.  If the write fails due to some other error,
 // that error is returned.
-func (v *UnixVolume) Put(loc string, block []byte) error {
-       if v.readonly {
+func (v *UnixVolume) Put(ctx context.Context, loc string, block []byte) error {
+       if v.ReadOnly {
                return MethodDisabledError
        }
        if v.IsFull() {
@@ -242,6 +274,11 @@ func (v *UnixVolume) Put(loc string, block []byte) error {
                v.locker.Lock()
                defer v.locker.Unlock()
        }
+       select {
+       case <-ctx.Done():
+               return ctx.Err()
+       default:
+       }
        if _, err := tmpfile.Write(block); err != nil {
                log.Printf("%s: writing to %s: %s\n", v, bpath, err)
                tmpfile.Close()
@@ -268,14 +305,14 @@ func (v *UnixVolume) Status() *VolumeStatus {
        var fs syscall.Statfs_t
        var devnum uint64
 
-       if fi, err := os.Stat(v.root); err == nil {
+       if fi, err := os.Stat(v.Root); err == nil {
                devnum = fi.Sys().(*syscall.Stat_t).Dev
        } else {
                log.Printf("%s: os.Stat: %s\n", v, err)
                return nil
        }
 
-       err := syscall.Statfs(v.root, &fs)
+       err := syscall.Statfs(v.Root, &fs)
        if err != nil {
                log.Printf("%s: statfs: %s\n", v, err)
                return nil
@@ -285,7 +322,12 @@ func (v *UnixVolume) Status() *VolumeStatus {
        // uses fs.Blocks - fs.Bfree.
        free := fs.Bavail * uint64(fs.Bsize)
        used := (fs.Blocks - fs.Bfree) * uint64(fs.Bsize)
-       return &VolumeStatus{v.root, devnum, free, used}
+       return &VolumeStatus{
+               MountPoint: v.Root,
+               DeviceNum:  devnum,
+               BytesFree:  free,
+               BytesUsed:  used,
+       }
 }
 
 var blockDirRe = regexp.MustCompile(`^[0-9a-f]+$`)
@@ -307,7 +349,7 @@ var blockFileRe = regexp.MustCompile(`^[0-9a-f]{32}$`)
 //
 func (v *UnixVolume) IndexTo(prefix string, w io.Writer) error {
        var lastErr error
-       rootdir, err := os.Open(v.root)
+       rootdir, err := os.Open(v.Root)
        if err != nil {
                return err
        }
@@ -326,7 +368,7 @@ func (v *UnixVolume) IndexTo(prefix string, w io.Writer) error {
                if !blockDirRe.MatchString(names[0]) {
                        continue
                }
-               blockdirpath := filepath.Join(v.root, names[0])
+               blockdirpath := filepath.Join(v.Root, names[0])
                blockdir, err := os.Open(blockdirpath)
                if err != nil {
                        log.Print("Error reading ", blockdirpath, ": ", err)
@@ -360,9 +402,9 @@ func (v *UnixVolume) IndexTo(prefix string, w io.Writer) error {
 }
 
 // Trash trashes the block data from the unix storage
-// If trashLifetime == 0, the block is deleted
+// If TrashLifetime == 0, the block is deleted
 // Else, the block is renamed as path/{loc}.trash.{deadline},
-// where deadline = now + trashLifetime
+// where deadline = now + TrashLifetime
 func (v *UnixVolume) Trash(loc string) error {
        // Touch() must be called before calling Write() on a block.  Touch()
        // also uses lockfile().  This avoids a race condition between Write()
@@ -372,7 +414,7 @@ func (v *UnixVolume) Trash(loc string) error {
        // Trash() will read the correct up-to-date timestamp and choose not to
        // trash the file.
 
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
        if v.locker != nil {
@@ -397,21 +439,21 @@ func (v *UnixVolume) Trash(loc string) error {
        // anyway (because the permission signatures have expired).
        if fi, err := os.Stat(p); err != nil {
                return err
-       } else if time.Since(fi.ModTime()) < blobSignatureTTL {
+       } else if time.Since(fi.ModTime()) < time.Duration(theConfig.BlobSignatureTTL) {
                return nil
        }
 
-       if trashLifetime == 0 {
+       if theConfig.TrashLifetime == 0 {
                return os.Remove(p)
        }
-       return os.Rename(p, fmt.Sprintf("%v.trash.%d", p, time.Now().Add(trashLifetime).Unix()))
+       return os.Rename(p, fmt.Sprintf("%v.trash.%d", p, time.Now().Add(theConfig.TrashLifetime.Duration()).Unix()))
 }
 
 // Untrash moves block from trash back into store
 // Look for path/{loc}.trash.{deadline} in storage,
 // and rename the first such file as path/{loc}
 func (v *UnixVolume) Untrash(loc string) (err error) {
-       if v.readonly {
+       if v.ReadOnly {
                return MethodDisabledError
        }
 
@@ -446,7 +488,7 @@ func (v *UnixVolume) Untrash(loc string) (err error) {
 // blockDir returns the fully qualified directory name for the directory
 // where loc is (or would be) stored on this volume.
 func (v *UnixVolume) blockDir(loc string) string {
-       return filepath.Join(v.root, loc[0:3])
+       return filepath.Join(v.Root, loc[0:3])
 }
 
 // blockPath returns the fully qualified pathname for the path to loc
@@ -459,7 +501,7 @@ func (v *UnixVolume) blockPath(loc string) string {
 // MinFreeKilobytes.
 //
 func (v *UnixVolume) IsFull() (isFull bool) {
-       fullSymlink := v.root + "/full"
+       fullSymlink := v.Root + "/full"
 
        // Check if the volume has been marked as full in the last hour.
        if link, err := os.Readlink(fullSymlink); err == nil {
@@ -491,7 +533,7 @@ func (v *UnixVolume) IsFull() (isFull bool) {
 //
 func (v *UnixVolume) FreeDiskSpace() (free uint64, err error) {
        var fs syscall.Statfs_t
-       err = syscall.Statfs(v.root, &fs)
+       err = syscall.Statfs(v.Root, &fs)
        if err == nil {
                // Statfs output is not guaranteed to measure free
                // space in terms of 1K blocks.
@@ -501,19 +543,19 @@ func (v *UnixVolume) FreeDiskSpace() (free uint64, err error) {
 }
 
 func (v *UnixVolume) String() string {
-       return fmt.Sprintf("[UnixVolume %s]", v.root)
+       return fmt.Sprintf("[UnixVolume %s]", v.Root)
 }
 
 // Writable returns false if all future Put, Mtime, and Delete calls
 // are expected to fail.
 func (v *UnixVolume) Writable() bool {
-       return !v.readonly
+       return !v.ReadOnly
 }
 
 // Replication returns the number of replicas promised by the
-// underlying device (currently assumed to be 1).
+// underlying device (as specified in configuration).
 func (v *UnixVolume) Replication() int {
-       return 1
+       return v.DirectoryReplication
 }
 
 // lockfile and unlockfile use flock(2) to manage kernel file locks.
@@ -546,7 +588,7 @@ func (v *UnixVolume) EmptyTrash() {
        var bytesDeleted, bytesInTrash int64
        var blocksDeleted, blocksInTrash int
 
-       err := filepath.Walk(v.root, func(path string, info os.FileInfo, err error) error {
+       err := filepath.Walk(v.Root, func(path string, info os.FileInfo, err error) error {
                if err != nil {
                        log.Printf("EmptyTrash: filepath.Walk: %v: %v", path, err)
                        return nil
index c95538bc4da380f7af5561984d7a069324cea970..3021d6bd362724e7136d1054095e49bb53778199 100644 (file)
@@ -2,6 +2,7 @@ package main
 
 import (
        "bytes"
+       "context"
        "errors"
        "fmt"
        "io"
@@ -30,9 +31,9 @@ func NewTestableUnixVolume(t TB, serialize bool, readonly bool) *TestableUnixVol
        }
        return &TestableUnixVolume{
                UnixVolume: UnixVolume{
-                       root:     d,
+                       Root:     d,
+                       ReadOnly: readonly,
                        locker:   locker,
-                       readonly: readonly,
                },
                t: t,
        }
@@ -42,10 +43,10 @@ func NewTestableUnixVolume(t TB, serialize bool, readonly bool) *TestableUnixVol
 // the volume is readonly.
 func (v *TestableUnixVolume) PutRaw(locator string, data []byte) {
        defer func(orig bool) {
-               v.readonly = orig
-       }(v.readonly)
-       v.readonly = false
-       err := v.Put(locator, data)
+               v.ReadOnly = orig
+       }(v.ReadOnly)
+       v.ReadOnly = false
+       err := v.Put(context.Background(), locator, data)
        if err != nil {
                v.t.Fatal(err)
        }
@@ -59,7 +60,7 @@ func (v *TestableUnixVolume) TouchWithDate(locator string, lastPut time.Time) {
 }
 
 func (v *TestableUnixVolume) Teardown() {
-       if err := os.RemoveAll(v.root); err != nil {
+       if err := os.RemoveAll(v.Root); err != nil {
                v.t.Fatal(err)
        }
 }
@@ -101,13 +102,26 @@ func TestUnixVolumeHandlersWithGenericVolumeTests(t *testing.T) {
        })
 }
 
+func TestReplicationDefault1(t *testing.T) {
+       v := &UnixVolume{
+               Root:     "/",
+               ReadOnly: true,
+       }
+       if err := v.Start(); err != nil {
+               t.Error(err)
+       }
+       if got := v.Replication(); got != 1 {
+               t.Errorf("Replication() returned %d, expected 1 if no config given", got)
+       }
+}
+
 func TestGetNotFound(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
-       v.Put(TestHash, TestBlock)
+       v.Put(context.Background(), TestHash, TestBlock)
 
        buf := make([]byte, BlockSize)
-       n, err := v.Get(TestHash2, buf)
+       n, err := v.Get(context.Background(), TestHash2, buf)
        switch {
        case os.IsNotExist(err):
                break
@@ -122,11 +136,11 @@ func TestPut(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
 
-       err := v.Put(TestHash, TestBlock)
+       err := v.Put(context.Background(), TestHash, TestBlock)
        if err != nil {
                t.Error(err)
        }
-       p := fmt.Sprintf("%s/%s/%s", v.root, TestHash[:3], TestHash)
+       p := fmt.Sprintf("%s/%s/%s", v.Root, TestHash[:3], TestHash)
        if buf, err := ioutil.ReadFile(p); err != nil {
                t.Error(err)
        } else if bytes.Compare(buf, TestBlock) != 0 {
@@ -139,8 +153,8 @@ func TestPutBadVolume(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
 
-       os.Chmod(v.root, 000)
-       err := v.Put(TestHash, TestBlock)
+       os.Chmod(v.Root, 000)
+       err := v.Put(context.Background(), TestHash, TestBlock)
        if err == nil {
                t.Error("Write should have failed")
        }
@@ -153,12 +167,12 @@ func TestUnixVolumeReadonly(t *testing.T) {
        v.PutRaw(TestHash, TestBlock)
 
        buf := make([]byte, BlockSize)
-       _, err := v.Get(TestHash, buf)
+       _, err := v.Get(context.Background(), TestHash, buf)
        if err != nil {
                t.Errorf("got err %v, expected nil", err)
        }
 
-       err = v.Put(TestHash, TestBlock)
+       err = v.Put(context.Background(), TestHash, TestBlock)
        if err != MethodDisabledError {
                t.Errorf("got err %v, expected MethodDisabledError", err)
        }
@@ -178,7 +192,7 @@ func TestIsFull(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
 
-       fullPath := v.root + "/full"
+       fullPath := v.Root + "/full"
        now := fmt.Sprintf("%d", time.Now().Unix())
        os.Symlink(now, fullPath)
        if !v.IsFull() {
@@ -200,8 +214,8 @@ func TestNodeStatus(t *testing.T) {
 
        // Get node status and make a basic sanity check.
        volinfo := v.Status()
-       if volinfo.MountPoint != v.root {
-               t.Errorf("GetNodeStatus mount_point %s, expected %s", volinfo.MountPoint, v.root)
+       if volinfo.MountPoint != v.Root {
+               t.Errorf("GetNodeStatus mount_point %s, expected %s", volinfo.MountPoint, v.Root)
        }
        if volinfo.DeviceNum == 0 {
                t.Errorf("uninitialized device_num in %v", volinfo)
@@ -218,9 +232,9 @@ func TestUnixVolumeGetFuncWorkerError(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
 
-       v.Put(TestHash, TestBlock)
+       v.Put(context.Background(), TestHash, TestBlock)
        mockErr := errors.New("Mock error")
-       err := v.getFunc(v.blockPath(TestHash), func(rdr io.Reader) error {
+       err := v.getFunc(context.Background(), v.blockPath(TestHash), func(rdr io.Reader) error {
                return mockErr
        })
        if err != mockErr {
@@ -233,7 +247,7 @@ func TestUnixVolumeGetFuncFileError(t *testing.T) {
        defer v.Teardown()
 
        funcCalled := false
-       err := v.getFunc(v.blockPath(TestHash), func(rdr io.Reader) error {
+       err := v.getFunc(context.Background(), v.blockPath(TestHash), func(rdr io.Reader) error {
                funcCalled = true
                return nil
        })
@@ -249,13 +263,13 @@ func TestUnixVolumeGetFuncWorkerWaitsOnMutex(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
 
-       v.Put(TestHash, TestBlock)
+       v.Put(context.Background(), TestHash, TestBlock)
 
        mtx := NewMockMutex()
        v.locker = mtx
 
        funcCalled := make(chan struct{})
-       go v.getFunc(v.blockPath(TestHash), func(rdr io.Reader) error {
+       go v.getFunc(context.Background(), v.blockPath(TestHash), func(rdr io.Reader) error {
                funcCalled <- struct{}{}
                return nil
        })
@@ -284,26 +298,26 @@ func TestUnixVolumeCompare(t *testing.T) {
        v := NewTestableUnixVolume(t, false, false)
        defer v.Teardown()
 
-       v.Put(TestHash, TestBlock)
-       err := v.Compare(TestHash, TestBlock)
+       v.Put(context.Background(), TestHash, TestBlock)
+       err := v.Compare(context.Background(), TestHash, TestBlock)
        if err != nil {
                t.Errorf("Got err %q, expected nil", err)
        }
 
-       err = v.Compare(TestHash, []byte("baddata"))
+       err = v.Compare(context.Background(), TestHash, []byte("baddata"))
        if err != CollisionError {
                t.Errorf("Got err %q, expected %q", err, CollisionError)
        }
 
-       v.Put(TestHash, []byte("baddata"))
-       err = v.Compare(TestHash, TestBlock)
+       v.Put(context.Background(), TestHash, []byte("baddata"))
+       err = v.Compare(context.Background(), TestHash, TestBlock)
        if err != DiskHashError {
                t.Errorf("Got err %q, expected %q", err, DiskHashError)
        }
 
-       p := fmt.Sprintf("%s/%s/%s", v.root, TestHash[:3], TestHash)
+       p := fmt.Sprintf("%s/%s/%s", v.Root, TestHash[:3], TestHash)
        os.Chmod(p, 000)
-       err = v.Compare(TestHash, TestBlock)
+       err = v.Compare(context.Background(), TestHash, TestBlock)
        if err == nil || strings.Index(err.Error(), "permission denied") < 0 {
                t.Errorf("Got err %q, expected %q", err, "permission denied")
        }
index e1b8c484f0413cb8ff6bfe3ac0be77aebbcd2aa7..22cf0c446bbc48c03b2de61c5a91b2739c9e88ad 100755 (executable)
@@ -14,13 +14,19 @@ req_envs.each do |k|
   end
 end
 
-keys = ''
+exclusive_mode = ARGV.index("--exclusive")
+exclusive_banner = "#######################################################################################
+#  THIS FILE IS MANAGED BY #{$0} -- CHANGES WILL BE OVERWRITTEN  #
+#######################################################################################\n\n"
+start_banner = "### BEGIN Arvados-managed keys -- changes between markers will be overwritten\n"
+end_banner = "### END Arvados-managed keys -- changes between markers will be overwritten\n"
 
-seen = Hash.new
+# Don't try to create any local accounts
+skip_missing_users = ARGV.index("--skip-missing-users")
+
+keys = ''
 
 begin
-  uids = Hash[Etc.to_enum(:passwd).map { |ent| [ent.name, ent.uid] }]
-  gids = Hash[Etc.to_enum(:group).map { |ent| [ent.name, ent.gid] }]
   arv = Arvados.new({ :suppress_ssl_warnings => false })
 
   vm_uuid = ENV['ARVADOS_VIRTUAL_MACHINE_UUID']
@@ -45,8 +51,24 @@ begin
       uid_min = new_uid_min if (new_uid_min > 0)
     end
   end
-  logins.reject! { |l| (uids[l[:username]] || 65535) < uid_min }
 
+  pwnam = Hash.new()
+  logins.reject! do |l|
+    return false if pwnam[l[:username]]
+    begin
+      pwnam[l[:username]] = Etc.getpwnam(l[:username])
+    rescue
+      if skip_missing_users
+        STDERR.puts "Account #{l[:username]} not found. Skipping"
+        true
+      end
+    else
+      if pwnam[l[:username]].uid < uid_min
+        STDERR.puts "Account #{l[:username]} uid #{pwnam[l[:username]].uid} < uid_min #{uid_min}. Skipping"
+        true
+      end
+    end
+  end
   keys = Hash.new()
 
   # Collect all keys
@@ -67,40 +89,65 @@ begin
 
   logins.each do |l|
     next if seen[l[:username]]
-    seen[l[:username]] = true if not seen.has_key?(l[:username])
+    seen[l[:username]] = true
 
-    unless uids[l[:username]]
+    unless pwnam[l[:username]]
       STDERR.puts "Creating account #{l[:username]}"
       groups = l[:groups] || []
       # Adding users to the FUSE group has long been hardcoded behavior.
       groups << "fuse"
-      groups.select! { |name| gids[name] }
+      groups.select! { |g| Etc.getgrnam(g) rescue false }
       # Create new user
-      next unless system("useradd", "-m",
-                         "-c", l[:username],
-                         "-s", "/bin/bash",
-                         "-G", groups.join(","),
-                         l[:username],
-                         out: devnull)
+      unless system("useradd", "-m",
+                "-c", l[:username],
+                "-s", "/bin/bash",
+                "-G", groups.join(","),
+                l[:username],
+                out: devnull)
+        STDERR.puts "Account creation failed for #{l[:username]}: $?"
+        next
+      end
+      begin
+        pwnam[l[:username]] = Etc.getpwnam(l[:username])
+      rescue => e
+        STDERR.puts "Created account but then getpwnam() failed for #{l[:username]}: #{e}"
+        raise
+      end
     end
-    # Create .ssh directory if necessary
-    @homedir = Etc.getpwnam(l[:username]).dir
+
+    @homedir = pwnam[l[:username]].dir
     userdotssh = File.join(@homedir, ".ssh")
     Dir.mkdir(userdotssh) if !File.exists?(userdotssh)
-    @key = "#######################################################################################
-#  THIS FILE IS MANAGED BY #{$0} -- CHANGES WILL BE OVERWRITTEN  #
-#######################################################################################\n\n"
-    @key += keys[l[:username]].join("\n") + "\n"
-    userauthkeys = File.join(userdotssh, "authorized_keys")
-    if !File.exists?(userauthkeys) or IO::read(userauthkeys) != @key then
-      f = File.new(userauthkeys, 'w')
-      f.write(@key)
+
+    newkeys = "###\n###\n" + keys[l[:username]].join("\n") + "\n###\n###\n"
+
+    keysfile = File.join(userdotssh, "authorized_keys")
+
+    if File.exists?(keysfile)
+      oldkeys = IO::read(keysfile)
+    else
+      oldkeys = ""
+    end
+
+    if exclusive_mode
+      newkeys = exclusive_banner + newkeys
+    elsif oldkeys.start_with?(exclusive_banner)
+      newkeys = start_banner + newkeys + end_banner
+    elsif (m = /^(.*?\n|)#{start_banner}(.*?\n|)#{end_banner}(.*)/m.match(oldkeys))
+      newkeys = m[1] + start_banner + newkeys + end_banner + m[3]
+    else
+      newkeys = start_banner + newkeys + end_banner + oldkeys
+    end
+
+    if oldkeys != newkeys then
+      f = File.new(keysfile, 'w')
+      f.write(newkeys)
       f.close()
     end
-    FileUtils.chown_R(l[:username], l[:username], userdotssh)
+    FileUtils.chown_R(l[:username], nil, userdotssh)
     File.chmod(0700, userdotssh)
     File.chmod(0750, @homedir)
-    File.chmod(0600, userauthkeys)
+    File.chmod(0600, keysfile)
   end
 
   devnull.close
index 7a010c2a64062cb70a6ef916747c47493e3cdcf1..caaadd5fc9c352767b6d21fb78e370e2f2fc38d1 100644 (file)
@@ -27,7 +27,7 @@ class TestAddUser < Minitest::Test
       f.puts 'useradd -m -c adminroot -s /bin/bash -G docker,fuse adminroot'
       f.puts 'useradd -m -c adminroot -s /bin/bash -G docker,admin,fuse adminroot'
     end
-    $stderr.puts "*** Expect crash in dir_s_mkdir:"
+    $stderr.puts "*** Expect crash after getpwnam() fails:"
     invoke_sync binstubs: ['new_user']
     assert !$?.success?
     spied = File.read(@tmpdir+'/spy')
index 2ebe13c895eb16a775ca247b028a60cdc6eba59c..474913170a624a618ab82bad57dd74c4ca790cf3 100755 (executable)
@@ -104,6 +104,8 @@ run() {
     CONFIG=$1
     TAG=$2
 
+    shift
+
     if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
         echo "Container $ARVBOX_CONTAINER is already running"
         exit 0
@@ -113,10 +115,15 @@ run() {
         echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or rebuild"
         exit 1
     fi
-   
+
     if test ! -z "$TAG"
     then
-       TAG=":$TAG"
+        if test $(echo $TAG | cut -c1-1) != '-' ; then
+           TAG=":$TAG"
+            shift
+        else
+            unset TAG
+        fi
     fi
 
     if echo "$CONFIG" | grep '^public' ; then
@@ -260,11 +267,20 @@ build() {
         echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
         exit 1
     fi
-    docker build $NO_CACHE -t arvados/arvbox-base -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
+    if docker --version |grep " 1\.[0-9]\." ; then
+        # Docker version prior 1.10 require -f flag
+        # -f flag removed in Docker 1.12
+        FORCE=-f
+    fi
+    GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD)
+    docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
+    docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest
     if test "$1" = localdemo -o "$1" = publicdemo ; then
-        docker build $NO_CACHE -t arvados/arvbox-demo -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
+        docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
+        docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest
     else
-        docker build $NO_CACHE -t arvados/arvbox-dev -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
+        docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
+        docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest
     fi
 }
 
@@ -397,7 +413,7 @@ case "$subcmd" in
 
     cat)
         if test -n "$1" ; then
-            exec docker exec -ti $ARVBOX_CONTAINER cat "$@"
+            exec docker exec $ARVBOX_CONTAINER cat "$@"
         else
             echo "Usage: $0 $subcmd <files>"
         fi
index 9dee8847cf57bee6a8115df73f3e21d210bec79a..6568a887b3c829681de54cc294b68389f3cc0001 100644 (file)
@@ -1,27 +1,48 @@
 FROM debian:8
 
-RUN apt-get update
+ENV DEBIAN_FRONTEND noninteractive
 
-RUN DEBIAN_FRONTEND=noninteractive apt-get -yq --no-install-recommends install \
-    postgresql-9.4 git build-essential runit \
-    ruby rake bundler curl libpq-dev ruby-dev \
+RUN apt-get clean && \
+    apt-get update && \
+    apt-get -yq --no-install-recommends -o Acquire::Retries=6 install \
+    postgresql-9.4 git build-essential runit curl libpq-dev \
     libcurl4-openssl-dev libssl-dev zlib1g-dev libpcre3-dev \
     openssh-server python-setuptools netcat-traditional \
-    python-epydoc graphviz bzip2 less sudo virtualenv
-
-RUN DEBIAN_FRONTEND=noninteractive apt-get -yq --no-install-recommends install \
+    python-epydoc graphviz bzip2 less sudo virtualenv \
     libpython-dev fuse libfuse-dev python-pip python-yaml \
     pkg-config libattr1-dev python-llfuse python-pycurl \
     libwww-perl libio-socket-ssl-perl libcrypt-ssleay-perl \
-    libjson-perl nginx gitolite3 lsof \
-    apt-transport-https ca-certificates slurm-wlm
+    libjson-perl nginx gitolite3 lsof libreadline-dev \
+    apt-transport-https ca-certificates slurm-wlm \
+    linkchecker python3-virtualenv python-virtualenv xvfb iceweasel && \
+    apt-get clean
+
+ENV GOVERSION 1.7.3
 
+# Install golang binary
 RUN cd /usr/local && \
-    curl -O http://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz && \
-    tar -xzf go1.6.2.linux-amd64.tar.gz && \
-    rm go1.6.2.linux-amd64.tar.gz && \
-    cd bin && \
-    ln -s /usr/local/go/bin/* .
+    curl -O http://storage.googleapis.com/golang/go${GOVERSION}.linux-amd64.tar.gz && \
+    tar -xzf go${GOVERSION}.linux-amd64.tar.gz && \
+    rm go${GOVERSION}.linux-amd64.tar.gz
+
+ENV PATH ${PATH}:/usr/local/go/bin
+
+ENV RUBYVERSION 2.1.8
+
+# Install Ruby from source
+RUN cd /usr/local/lib && \
+ curl -O http://cache.ruby-lang.org/pub/ruby/2.1/ruby-${RUBYVERSION}.tar.gz && \
+ tar xzf ruby-${RUBYVERSION}.tar.gz && \
+ cd ruby-${RUBYVERSION} && \
+ ./configure --disable-install-doc && \
+ make && \
+ make install && \
+ cd /usr/local/lib && \
+ rm -rf ruby-${RUBYVERSION}.tar.gz ruby-${RUBYVERSION}
+
+ENV GEM_HOME /var/lib/gems
+ENV GEM_PATH /var/lib/gems
+ENV PATH $PATH:/var/lib/gems/bin
 
 VOLUME /var/lib/docker
 VOLUME /var/log/nginx
@@ -41,6 +62,15 @@ RUN cd /root && \
     GOPATH=$PWD go get github.com/curoverse/runsvinit && \
     install bin/runsvinit /usr/local/bin
 
+RUN set -e && \
+ PJS=phantomjs-1.9.7-linux-x86_64 && \
+ curl -L -o/tmp/$PJS.tar.bz2 http://cache.arvados.org/$PJS.tar.bz2 && \
+ tar -C /usr/local -xjf /tmp/$PJS.tar.bz2 && \
+ ln -s ../$PJS/bin/phantomjs /usr/local/bin/
+
+ARG arvados_version
+RUN echo arvados_version is git commit $arvados_version
+
 ADD fuse.conf /etc/
 
 ADD crunch-setup.sh gitolite.rc \
index 57105ea88bf4a58bf397e0b2fd74c1d520afee06..d58719b61d4c15a33d3ad41aaa5b58ec9f843bc9 100644 (file)
@@ -1,5 +1,5 @@
 FROM arvados/arvbox-base
-ARG arvados_version=master
+ARG arvados_version
 ARG sso_version=master
 
 RUN cd /usr/src && \
index e68642fecd5a2f0ff343eb869d569a43b945cd6a..f99551e786363bf135d8413c09982187bf85c4f4 100644 (file)
@@ -1,14 +1,5 @@
 FROM arvados/arvbox-base
-
-RUN apt-get update && \
-    DEBIAN_FRONTEND=noninteractive apt-get -yq --no-install-recommends install \
-    linkchecker python3-virtualenv python-virtualenv xvfb iceweasel
-
-RUN set -e && \
- PJS=phantomjs-1.9.7-linux-x86_64 && \
- curl -L -o/tmp/$PJS.tar.bz2 http://cache.arvados.org/$PJS.tar.bz2 && \
- tar -C /usr/local -xjf /tmp/$PJS.tar.bz2 && \
- ln -s ../$PJS/bin/phantomjs /usr/local/bin/
+ARG arvados_version
 
 ADD service/ /var/lib/arvbox/service
 RUN rmdir /etc/service && ln -sf /var/lib/arvbox/service /etc
index 3733fa2ecb187b7a1daa5ce7851546faf5856603..230a189a9a244c79d94380960f82d4ad52ddb6c3 100644 (file)
@@ -1,4 +1,8 @@
 
+export PATH=${PATH}:/usr/local/go/bin:/var/lib/gems/bin
+export GEM_HOME=/var/lib/gems
+export GEM_PATH=/var/lib/gems
+
 if test -s /var/run/localip_override ; then
     localip=$(cat /var/run/localip_override)
 else
@@ -6,9 +10,6 @@ else
     localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
 fi
 
-export GEM_HOME=/var/lib/gems
-export GEM_PATH=/var/lib/gems
-
 declare -A services
 services=(
   [workbench]=80
@@ -38,6 +39,9 @@ run_bundler() {
     else
         frozen=""
     fi
+    if ! test -x bundle ; then
+        gem install --no-document bundler
+    fi
     if ! flock /var/lib/gems/gems.lock bundle install --path $GEM_HOME --local --no-deployment $frozen "$@" ; then
         flock /var/lib/gems/gems.lock bundle install --path $GEM_HOME --no-deployment $frozen "$@"
     fi
@@ -45,12 +49,7 @@ run_bundler() {
 
 pip_install() {
     pushd /var/lib/pip
-    for p in $(ls http*.tar.gz) ; do
-        if test -f $p ; then
-            ln -sf $p $(echo $p | sed 's/.*%2F\(.*\)/\1/')
-        fi
-    done
-    for p in $(ls http*.whl) ; do
+    for p in $(ls http*.tar.gz) $(ls http*.whl) $(ls http*.zip) ; do
         if test -f $p ; then
             ln -sf $p $(echo $p | sed 's/.*%2F\(.*\)/\1/')
         fi
index 9efe1164c3c44a7b24d1c9b14316b34eeccc883d..0967c7950cfd43ee5dae538b7863c317299c112b 100755 (executable)
@@ -24,6 +24,7 @@ export CRUNCH_TMP=/tmp/$1
 export CRUNCH_DISPATCH_LOCKFILE=/var/lock/$1-dispatch
 export CRUNCH_JOB_DOCKER_BIN=docker
 export HOME=/tmp/$1
+export CRUNCH_JOB_DOCKER_RUN_ARGS=--net=host
 
 cd /usr/src/arvados/services/api
 if test "$1" = "crunch0" ; then
index 518fe33d049a753cd9cece8b416c46dc4045e483..b6caa14ccce73f0026084427a30d579a1c363211 100755 (executable)
@@ -20,12 +20,11 @@ fi
 
 export ARVADOS_API_HOST=$localip:${services[api]}
 export ARVADOS_API_HOST_INSECURE=1
-export GITOLITE_HTTP_HOME=/var/lib/arvados/git
-export GL_BYPASS_ACCESS_CHECKS=1
 export PATH="$PATH:/var/lib/arvados/git/bin"
 cd ~git
 
 exec /usr/local/bin/arv-git-httpd \
-     -address=:${services[arv-git-httpd]} \
-     -git-command=/usr/share/gitolite3/gitolite-shell \
-     -repo-root=/var/lib/arvados/git/repositories
+    -address=:${services[arv-git-httpd]} \
+    -git-command=/usr/share/gitolite3/gitolite-shell \
+    -gitolite-home=/var/lib/arvados/git \
+    -repo-root=/var/lib/arvados/git/repositories
index 977f61298ff7c475f69c7097e6b15d1650096a1b..c2487735ef0e5cd127882ea7dc48a1f3ffc9ecd6 100755 (executable)
@@ -70,11 +70,11 @@ if ! [[ -z "$waiting" ]] ; then
                      /usr/src/arvados/apps/workbench/Gemfile.lock \
                      /usr/src/sso/Gemfile.lock ; do
             gc=$(cat $l \
-                        | grep -vE "(GEM|PLATFORMS|DEPENDENCIES|$^|remote:|specs:)" \
+                        | grep -vE "(GEM|PLATFORMS|DEPENDENCIES|BUNDLED|GIT|$^|remote:|specs:|revision:)" \
                         | sed 's/^ *//' | sed 's/(.*)//' | sed 's/ *$//' | sort | uniq | wc -l)
             gemlockcount=$(($gemlockcount + $gc))
         done
-        waiting="$waiting (installing ruby gems $gemcount/$gemlockcount)"
+        waiting="$waiting (installing ruby gems $gemcount of about $gemlockcount)"
     fi
 
     if ps x | grep -v grep | grep "c++.*/var/lib/passenger" > /dev/null ; then
index 29452ab9943c7853da919fa130de0b5690e249ba..8afd2c8561e1250b741e9d32a69847f92f77abab 100755 (executable)
@@ -19,10 +19,10 @@ cd /usr/src/arvados/sdk/python
 python setup.py sdist
 pip_install $(ls dist/arvados-python-client-*.tar.gz | tail -n1)
 
-cd /usr/src/arvados/sdk/cwl
-python setup.py sdist
-pip_install $(ls dist/arvados-cwl-runner-*.tar.gz | tail -n1)
-
 cd /usr/src/arvados/services/fuse
 python setup.py sdist
 pip_install $(ls dist/arvados_fuse-*.tar.gz | tail -n1)
+
+cd /usr/src/arvados/sdk/cwl
+python setup.py sdist
+pip_install $(ls dist/arvados-cwl-runner-*.tar.gz | tail -n1)
index 9dc8f9425a8e4707bc4538842911511928428095..6d791bf9876a5b84a2b1b642025b730771f76da2 100644 (file)
@@ -47,7 +47,7 @@ func main() {
        if err != nil {
                log.Fatal(err)
        }
-       kc, err := keepclient.MakeKeepClient(&arv)
+       kc, err := keepclient.MakeKeepClient(arv)
        if err != nil {
                log.Fatal(err)
        }
@@ -56,11 +56,11 @@ func main() {
 
        overrideServices(kc)
 
-       nextBuf := make(chan []byte, *WriteThreads)
        nextLocator := make(chan string, *ReadThreads+*WriteThreads)
 
        go countBeans(nextLocator)
        for i := 0; i < *WriteThreads; i++ {
+               nextBuf := make(chan []byte, 1)
                go makeBufs(nextBuf, i)
                go doWrites(kc, nextBuf, nextLocator)
        }
@@ -106,23 +106,28 @@ func countBeans(nextLocator chan string) {
        }
 }
 
-func makeBufs(nextBuf chan []byte, threadID int) {
+func makeBufs(nextBuf chan<- []byte, threadID int) {
        buf := make([]byte, *BlockSize)
        if *VaryThread {
                binary.PutVarint(buf, int64(threadID))
        }
+       randSize := 524288
+       if randSize > *BlockSize {
+               randSize = *BlockSize
+       }
        for {
                if *VaryRequest {
-                       buf = make([]byte, *BlockSize)
-                       if _, err := io.ReadFull(rand.Reader, buf); err != nil {
+                       rnd := make([]byte, randSize)
+                       if _, err := io.ReadFull(rand.Reader, rnd); err != nil {
                                log.Fatal(err)
                        }
+                       buf = append(rnd, buf[randSize:]...)
                }
                nextBuf <- buf
        }
 }
 
-func doWrites(kc *keepclient.KeepClient, nextBuf chan []byte, nextLocator chan string) {
+func doWrites(kc *keepclient.KeepClient, nextBuf <-chan []byte, nextLocator chan<- string) {
        for buf := range nextBuf {
                locator, _, err := kc.PutB(buf)
                if err != nil {
@@ -139,7 +144,7 @@ func doWrites(kc *keepclient.KeepClient, nextBuf chan []byte, nextLocator chan s
        }
 }
 
-func doReads(kc *keepclient.KeepClient, nextLocator chan string) {
+func doReads(kc *keepclient.KeepClient, nextLocator <-chan string) {
        for locator := range nextLocator {
                rdr, size, url, err := kc.Get(locator)
                if err != nil {